在三个js中遍历后恢复正常

时间:2014-07-09 14:12:06

标签: three.js

在threejs中正在使用traverse方法为使用OBJMTLLoder加载的模型应用WireframeHelper,对于这种模型,我们必须使用遍历来为Object的子项应用Wireframe,所以在这里我可以应用使用遍历的线框等但是在遍历之后我无法返回到我的普通对象意味着我无法使用遍历的网格移除线框,网格将添加具有scene.add( wfh );的场景,其中wfh是WireframeHelper,但如果我使用scene.remove( wfh );删除网格化的WireframeHelper则无效

我需要知道在遍历之后我们可以恢复正常吗?在大多数情况下,我使用遍历来对我的模型进行更改:

以下是代码:

scene.traverse ( function (child)
{
    if (child instanceof THREE.Mesh)
    {
        wfh = new THREE.WireframeHelper( child, 0xffffff );
        scene.add( wfh );  
    }
});

更新代码:

globalObject.traverse ( function (child) {
    if (child instanceof THREE.Mesh)
        {
        wfh = new THREE.WireframeHelper( child,whfcolor );
        wfh.name = "wireframe_helper";

        wfh.material.opacity = 0.2;
        wfh.material.transparent = true;
        globalObject.add( wfh );

        }

     });

此处globalObject是分配给Object的全局变量,现在我可以在对象的子项上看到wireframe_helper,并可以通过以下代码删除线框

globalObject.traverse( function ( child ) {

  if (child instanceof THREE.Object3D)
  {
      //alert(child.name);
      if ( child.name && child.name === "wireframe_helper" && child.material ) {

          //alert('hi');male-02-1noCullingID_male-02-1noCulling.JP

              globalObject.remove( child );

               //child.material.wireframe = true;

          }
  }
});  
删除线框后仍然是线框仍然是对象的一部分任何线索?我正在

TypeError: this.children[i] is undefined
this.children[ i ].traverse( callback );

on line three.js 7885

1 个答案:

答案 0 :(得分:2)

WireframeHelper()创建一个添加到场景图中的对象。当您在traverse()操作中使用帮助程序时,您将向场景中添加许多对象。因此,如果要删除它们,则必须将它们保存到变量(在这种情况下为数组,因为您有许多变量)。所以这样的事情应该有效:

首先在第一个遍历()中命名助手:

wfh = new ...
wfh.name = "wireframe_helper";
scene.add( wfh );

然后你应该能够做到:

scene.traverse ( function (child)
{
    if (child.name === "wireframe_helper")
    {
        scene.remove( child );
    }
}

尝试遍历已删除的子项时,上面的代码可能会崩溃。 这是更新的代码:

to_remove = [];
scene.traverse ( function (child)
{
    if (child.name === "wireframe_helper")
        to_remove.push( child );
}
for (var i = 0; i < to_remove.length(); i++)
    scene.remove( to_remove[i] );