将OBJ文件加载到Three.js的过程

时间:2015-08-09 00:50:19

标签: javascript three.js

我正在尝试使用可爱的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]);
});

1 个答案:

答案 0 :(得分:1)

在您的对象经过加载程序解析后,您将在模型中生成什么内容。

您可以使用文本编辑器打开* .obj,并亲自查看组等。它不像three.js那样撕掉顶点并将它们放在一个单独的组中。