三个JS中LOD DAE对象的可见性

时间:2013-12-20 10:17:25

标签: three.js

我正在尝试在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?

2 个答案:

答案 0 :(得分:4)

编辑:以下答案已过时。可见性现在继承。例如,请参阅Show children of invisible parents

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]);
            }
        }

    }

} );

目标是仅更新属性已更改的对象。