2015-08-08 112 views
7

我想使用Three.js将obj文件上传到WebGL场景中。我看到一些示例代码,比如下面的代码很好用,但是我想知道命令是什么Three.js中的对象遍历的含义是什么?

object.traverse(); 

是做什么的?如果我们不进行遍历,会发生什么?谢谢。

// prepare loader and load the model 
var oLoader = new THREE.OBJLoader(); 
oLoader.load('models/chair.obj', function(object, materials) { 

// var material = new THREE.MeshFaceMaterial(materials); 
var material2 = new THREE.MeshLambertMaterial({ color: 0xa65e00 }); 

object.traverse(function(child) { 
if (child instanceof THREE.Mesh) { 

    // apply custom material 
    child.material = material2; 

    // enable casting shadows 
    child.castShadow = true; 
    child.receiveShadow = true; 
    } 
    }); 

    object.position.x = 0; 
object.position.y = 0; 
object.position.z = 0; 
object.scale.set(1, 1, 1); 
lesson6.scene.add(object); 
}); 

回答

11

它基本上是你的加载对象的迭代器。您可以将该函数传递给遍历()函数,该函数将为遍历的对象的每个子项调用。如果你在场景中调用traverse()。你遍历整个场景图。

+1

因此,我得到这个的方式是:在遍历参数中写入的函数将应用于我们对象的所有子项。对?现在,为了让自己更清楚,如果我们不想使用遍历功能,我们是否应该为场景的每个对象应用我们的函数(用遍历参数编写的函数)并合并所有结果? – mfaieghi

+0

是的,你说得对。 –

+2

对孩子的孩子会叫'object.traverse'吗?如果不是,调用'object.traverse'和'object.child.forEach'或'for'循环之间有什么区别? – Halt