【问题标题】:visibility of LOD DAE object in Three JS三个 JS 中 LOD DAE 对象的可见性
【发布时间】:2014-01-09 04:16:27
【问题描述】:

我正在尝试在我的 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
} );

}

所以问题:我如何实际设置(不)可见的任何 Object3D 或 subScene ?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    编辑:下面的答案已经过时了。可见性现在被继承。例如,请参阅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

    【讨论】:

      【解决方案2】:

      感谢上面 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]);
                  }
              }
      
          }
      
      } );
      

      目标是只更新属性发生变化的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-03
        • 2013-07-12
        • 2018-05-08
        • 2016-12-23
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2012-03-11
        相关资源
        最近更新 更多