Three.js 中的对象遍历是什么意思?

14
我想使用Three.js将obj文件上传到WebGL场景中。我看到了一些像下面的示例代码,它们运行良好,但我想知道命令是什么意思。

我正在尝试使用Three.js将obj文件上传到WebGL场景中。我看到一些类似下面的示例代码,它们工作得很好,但我想知道命令

的含义是什么。
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);
});
1个回答

18

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


1
所以,我的理解是:在traverse参数中编写的函数将应用于我们对象的所有子级。对吧?现在,为了让自己更清楚,如果我们不想使用traverse功能,我们是否应该将我们的函数(在traverse参数中编写的函数)应用于场景中的每个对象并合并所有结果? - mfaieghi
2
object.traverse 会在子孙节点上被调用吗?如果不会,那么调用 object.traverseobject.child.forEach 或者 for 循环有什么区别呢? - Halt
2
@Halt 是的,object.traverse 将会在每个子节点的子节点上被调用。基本上它以深度优先遍历方式遍历任何给定 Three.js 对象的所有后代。 - Hari krishna
@Harikrishna 感谢您的帮助! - Halt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接