如何在three.js中使用traverse来修改线框

时间:2013-10-08 12:32:06

标签: javascript three.js

我有几个对象,当它被选中时,复选框会将线框属性更改为true或false(运行时)。

function toggleWireFrame(obj){
     var f = function(obj2)
     {
         if(obj2.hasOwnProperty("material")){
     obj2.material.wireframe=!obj2.material.wireframe;
     }          
  }
     obj.traverse(f);   
 }

2 个答案:

答案 0 :(得分:1)

1)如果您逐个调用每个网格上的toggleWireFrame,您的代码应该有效。

toggleWireFrame(meshA);
toggleWireFrame(meshB);

如果这些网格中的每一个都由多个网格组成,并且您还需要切换所有子网格,这将是有意义的。例如,如果从OBJ文件导入模型,则可能会获得类似的网格层次结构。

2)或者您是否只想调用toggleWireFrame一次并让所有网格'线框切换?

如果是这种情况,则必须致电

toggleWireFrame(scene);

甚至

toggleWireFrame(myObject3D);

其中myObject3DObject3D个实例,它是您要切换线框状态的所有网格的父级。

traverse()通过迭代起始对象的所有子孙而来工作。您需要确保要切换到线框的所有对象都是此起始对象的父级,如上例所示。

3)另一种选择是使用数组在创建每个材料时存储它们,然后在用户切换复选框时迭代遍历此数组以更改线框属性。

答案 1 :(得分:0)

这是我在我的项目中使用的,它只是反转布尔值,因为它将是真或假。

function wireframeToggle(i) {
    bool = i.material.wireframe;
    i.material.wireframe = !bool;
}

Working example(x代表线框)