Tento descobrir como mostrar / ocultar Object3D e seus filhos a qualquer momento.
Atualmente, você pode fazer isso assim:
THREE.SceneUtils.traverseHierarchy( object, function ( object ) { object.visible = false; } );
Obrigado! Ele funciona como um encanto.
Para sua informação - para ocultar todos os filhos de myObject3D, o snippet acima agora deve ser:
myObject3D.traverse( function ( object ) { object.visible = false; } );
Acho que essa funcionalidade ainda não foi resolvida. Desejo ocultar um objeto (ocultar todos os filhos), mas a maneira atual de fazê-lo (atravessar) não é viável porque desejo manter o status visível de seus filhos. Por exemplo, algumas crianças são visíveis e outras não; ocultar o pai deve ocultar todos os filhos, mas exibi-lo novamente deve mostrar os filhos que estavam anteriormente visíveis.
Concordo. WebGLRenderer
precisa acomodar isso. É algo que estou pendente de fazer.
Para sua informação: configuração visível em um dos pais agora afeta os filhos também. (testado com r71)
Usando r72. A configuração visível no pai não parece afetar os filhos. A funcionalidade mudou novamente?
@agnivade não, não mudou. Definir visible
como false
significa que nem o objeto nem seus filhos serão renderizadores, independentemente dos filhos visible
. Se visible
estiver definido como true
, os filhos serão renderizados apenas se visible
estiver definido como true
.
Obrigado. Deve haver algo errado com meu código então, vou verificar.
obrigado
Você poderia apenas invocar
myObj3D.visible = false. Isso parece esconder tudo o que é filho do seu Object3D
chamando myObj3D.visible = true Mostra tudo.
É uma discussão antiga, mas há uma advertência importante aqui, definir visible como false "apenas" oculta o objeto e seus filhos para a câmera, mas eles ainda são visíveis para o raycaster, a menos que você use 2 camadas diferentes e as desative da camada o raycaster está observando. Se você quiser torná-los totalmente invisíveis, é necessário desativá-los na camada usada pelo raycaster.
Eu uso as camadas 0 e 1 para a câmera e apenas a camada 0 para raycasting, então posso ter objetos visíveis e raycasting:
obj.layers.enable(0);
obj.visible = true;
objetos visíveis, mas não iluminados:
obj.layers.disable(0);
obj.layers.enable(1);
obj.visible = true;
e objetos ocultos e não iluminados:
obj.layers.disable(0);
obj.layers.enable(1);
obj.visible = false;
@ jscastro76 você pode estar interessado em https://github.com/mrdoob/three.js/pull/19012
obrigado, vou dar uma olhada nisso!
Comentários muito úteis
Você poderia apenas invocar
myObj3D.visible = false. Isso parece esconder tudo o que é filho do seu Object3D
chamando myObj3D.visible = true Mostra tudo.