RGL очистить конкретную площадь участка
Я использую rgl
построить блочную модель - используя shade3d
визуализировать блоки.
Я хотел бы заменить некоторые блоки, используя интерактивный процесс. Проблема в том, что рендеринг является кумулятивным, поэтому, если я наложу белый куб с альфа 0,5 на синий куб с альфа 1, я все равно увижу синий куб. [увидеть ниже]. Я посмотрел на clear3d, но, похоже, работает только на глобальном уровне. Есть идеи?
shade3d(translate3d(cube3d(),
1,
1,
1),
col="blue",
alpha = 1)
После некоторой работы:
shade3d(translate3d(cube3d(),
1,
1,
1),
col="white",
alpha = 0.5)
1 ответ
clear3d()
удаляет все объекты, как вы обнаружили. Чтобы удалить один объект, вы хотите rgl.pop()
,
Если вы знаете идентификатор объекта заданной фигуры (то есть его положение в стеке построенных объектов), вы можете использовать rgl.pop()
удалить это. Таким образом, ключевая деталь бухгалтерии заключается в том, что вы должны отслеживать идентификатор объекта любого объекта, который вы позже захотите удалить.
(Удобно, что большинство функций rgl, побочным эффектом которых является отрисовка объекта на устройстве rgl, возвращают идентификатор объекта (или вектор идентификаторов) в качестве возвращаемого значения. В качестве альтернативы используйте rgl.ids()
для доступа к идентификаторам объектов всех объектов, нанесенных на график на текущем устройстве.)
Еще несколько деталей из ?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)