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)

введите описание изображения здесь

Другие вопросы по тегам