问题 对象遍历在Three.js中意味着什么?


我试图使用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);
});

2097
2017-08-08 22:59


起源



答案:


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


14
2017-08-08 23:06



所以,我得到的方法是:在traverse参数中编写的函数将应用于我们对象的所有子元素。对?现在,为了使自己更清楚,如果我们不想使用遍历功能,我们是否应该为场景的每个对象应用我们的函数(用遍历参数编写的函数)并合并所有结果? - mfaieghi
是的,你做对了。 - Robert Cepa
将 object.traverse 被孩子的孩子打电话?如果没有,呼叫之间有什么区别 object.traverse 和 object.child.forEach, 要么 for 循环? - Halt
@Halt是的, object.traverse 每个孩子的孩子都会被召唤。基本上,它以Depth First Traversal方式遍历任何给定的三个js对象的所有后代。 - Hari krishna
@Harikrishna感谢您的帮助! - Halt


答案:


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


14
2017-08-08 23:06



所以,我得到的方法是:在traverse参数中编写的函数将应用于我们对象的所有子元素。对?现在,为了使自己更清楚,如果我们不想使用遍历功能,我们是否应该为场景的每个对象应用我们的函数(用遍历参数编写的函数)并合并所有结果? - mfaieghi
是的,你做对了。 - Robert Cepa
将 object.traverse 被孩子的孩子打电话?如果没有,呼叫之间有什么区别 object.traverse 和 object.child.forEach, 要么 for 循环? - Halt
@Halt是的, object.traverse 每个孩子的孩子都会被召唤。基本上,它以Depth First Traversal方式遍历任何给定的三个js对象的所有后代。 - Hari krishna
@Harikrishna感谢您的帮助! - Halt