我正在尝试在ThreeJS场景中使用THREE.LOD对象。我受http://threejs.org/examples/webgl_lod.html
的启发但是我想进一步推动这个想法并使用DAE模型(使用这个加载器:http://threejs.org/examples/webgl_loader_collada.html)
问题是我无法切换lod级别的可见性。首先,我在我的渲染功能中尝试了一个自动渲染功能(根据相机的距离,在示例中找到):
this.m_Scene.traverse( function ( object ) {
if ( object instanceof THREE.LOD ) {
object.update( that.m_Camera );
}
} );
因为它不起作用(所有我的lod同时显示)。我尝试了更多手动的东西。并且看起来Object3D.visibility属性并没有被渲染器真正使用,或者没有被子节点继承。
据我了解,此属性适用于网格。但我不确定它是否在渲染时检查过。
所以这不能按预期工作:
var LodTemporaryObject = new THREE.LOD();
function LoadLod1()
{
//TEST COLLADA LOADER
var loader = new THREE.ColladaLoader();
loader.options.convertUpAxis = true;
loader.load(Lod2Path, function ( collada ) {
dae = collada.scene;
dae.scale.x = dae.scale.y = dae.scale.z = 0.1;
dae.updateMatrix();
dae.visible = false; //THIS HAS NO EFFECT
LodTemporaryObject.addLevel(dae,100);
AddLodToScene(LodTemporaryObject ); //where the lod is added to the threeJS scene object
} );
}
所以问题:我如何实际设置(in)可见任何Object3D或subScene?
答案 0 :(得分:4)
three.js r.71
WebGLRenderer
的孩子不会继承可见性。
解决方法是使用这样的模式:
object.traverse( function( child ) {
if ( child instanceof THREE.Mesh ) {
child.visible = false;
}
}
three.js r.64
答案 1 :(得分:0)
向WestLangley回答上面的问题,我提出了一个解决问题的递归方法:
首先,一个递归函数来更新子项的可见性以匹配父项:
function SetChildrenVisible(parent)
{
if(parent instanceof THREE.Object3D)
{
for(var i = 0; i< parent.children.length; i ++)
{
parent.children[i].visible = parent.visible;
SetChildrenVisible(parent.children[i]);
}
}
}
然后在我的渲染循环中:
this.m_Scene.traverse( function ( object ) {
if ( object instanceof THREE.LOD ) {
//save all lodLevel state before updating
var oldVisible =[]; object.visible;
for(var i = 0; i< object.children.length; i++)
{
oldVisible.push(object.children[i].visible)
}
//Update Lod
object.update( that.m_Camera );
//Check for changes and update accordingly
for(var i = 0; i< object.children.length; i++)
{
if(oldVisible[i] != object.children[i].visible )
{
SetChildrenVisible(object.children[i]);
}
}
}
} );
目标是仅更新属性已更改的对象。