我正在尝试使用可爱的Three.js将一个OBJ及其关联的MTL文件上传到WebGL场景中。
我刚刚想出了一个我无法找到理由的问题。我在代码中放了一些全局变量来监视加载OBJ和MTL文件时发生了什么。虽然它只是一组文件,但是" obj"变量来自" Group"类型,它确实有两个孩子"。它本身不是网格的实例,但它的子节点是,如console.log()所说。但是,当我检查子项内部时,第一个 - 由geo [0]测量 - 只包含顶点和"面"数组是空的。然而,第二个孩子 - 由geo [1]测量 - 具有所有顶点和面。使用obj时,只需使用geo [1]即可获得相同的场景。
我关心的是这背后的逻辑。为什么对于一组OBJ和MTL文件,我们有一个带有两个子节点的对象,其中第一个子节点只有顶点,第二个节点又有顶点并且还有面。
这对我很重要,因为我想处理顶点和面以获得体素化体积,这需要对场景对象进行直接操作。
scapula = new THREE.OBJMTLLoader();
scapula.load('obj/scapulaTWO.obj', 'obj/scapulaTWO.mtl', function (object) {
// var material = new THREE.MeshFaceMaterial(materials);
var material = new THREE.MeshLambertMaterial({
color: 0xFFFF66
});
obj = object; //group
object.traverse(function (child) {
if (child instanceof THREE.Mesh) {
console.log(child instanceof THREE.Mesh)
geo[i] = child; //mesh
// apply custom material
child.material = material;
// enable casting shadows
child.castShadow = true;
child.receiveShadow = true;
i = i + 1;
}
});
scene.add(geo[1]);
});
答案 0 :(得分:1)
在您的对象经过加载程序解析后,您将在模型中生成什么内容。
您可以使用文本编辑器打开* .obj,并亲自查看组等。它不像three.js那样撕掉顶点并将它们放在一个单独的组中。