2

我一直在使用rgl绘制块模型 -shade3d用于渲染块。

我想使用交互式过程替换某些块。问题是渲染是累积的,所以如果我将一个 alpha 0.5 的白色立方体覆盖在一个 alpha 1 的蓝色立方体上,我仍然会看到蓝色立方体。[见下文]。我查看了 clear3d,但似乎只在全球范围内工作。有任何想法吗?

  shade3d(translate3d(cube3d(),
                      1,
                      1,
                      1),
          col="blue",
          alpha = 1)

经过一番工作:

  shade3d(translate3d(cube3d(),
                      1,
                      1,
                      1),
          col="white",
          alpha = 0.5)
4

1 回答 1

3

clear3d()如您所见,删除所有对象。要删除单个对象,您需要rgl.pop().

只要您知道给定形状的对象 ID(即它在绘图对象堆栈上的位置),您就可以使用rgl.pop()它来删除它。因此,关键的簿记细节是您必须跟踪您以后可能要删除的任何对象的对象 ID。

(方便的是,大多数rgl函数的副作用是将对象绘制到 rgl 设备返回对象 ID(或 ID 的向量)作为其返回值。或者,用于rgl.ids()访问当前设备上绘制的所有对象的对象 ID .)

更多细节来自?rgl.pop

RGL holds two stacks. One is for shapes and the other is for
lights.  'clear3d' and 'rgl.clear' clear the specified stack, or
restore the defaults for the bounding box (not visible) or
viewpoint.  By default with 'id=0' 'rgl.pop' removes the top-most
(last added) node on the shape stack.  The 'id' argument may be
used to specify arbitrary item(s) to remove from the specified
stack.

因此,在您的情况下,您可能会这样做:

library(rgl)

ii <- shade3d(translate3d(cube3d(), 1, 1, 1), col="blue", alpha = 1)
shade3d(translate3d(cube3d(), 1, 1, 1), col="white", alpha = 0.5)
rgl.pop(id = ii)

在此处输入图像描述

于 2013-11-14T17:19:58.557 回答