2013-11-14 9 views
1

Я использую rgl для построения блок-модели - используя shade3d для визуализации блоков.rgl clear определенная площадь участка

Я хочу заменить определенные блоки, используя интерактивный процесс. Проблема заключается в том, что рендеринг является кумулятивным, поэтому, если я накладываю белый куб с альфа-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) 

enter image description here

+0

Спасибо, что это очень полезно! Я только что присоединился, поэтому пока не могу его проголосовать, но очень ценю ... – Troy

+0

Рад, что помогло. Вы не случайно используете Tetris, используя R и 'rgl', вы ;-) –

Смежные вопросы