构造后,将纹理添加到从MTL文件加载的OBJ材质中

时间:2018-10-12 10:35:46

标签: javascript three.js 3d opengl-es render

我制作了一个加载OBJ和MTL文件的查看器。

MTL仅用于将一组不同的纹理放在一起,这些纹理将应用于单个OBJ文件中的特定网格。

MTL包含以下材料(例如):

  • 抓地力
  • 身体(在这种情况下无关紧要。始终只是静态纹理)

OBJ有时可能具有另一种材料,称为“刀片”。 MTL文件中(故意)缺少此材料。

如果threeJS用“ Blade”材料加载模型,它将对“ Grip”和“ Body”应用纹理。实际上已添加了“刀片”材质(因为它在OBJ中),但是它是空的,因为它不在MTL文件中。

我要做什么:

我想检查“ blade”材料是否由ThreeJS创建(存在于obj中)。如果是这种情况,则应将所有设置(包括纹理)从“抓取”(始终分配和纹理化)复制到其中,它们都共享纹理,只是稍后会动态更改光泽。

这是我的(部分工作)代码。如果obj不包含“ blade”,那么它就可以完美工作(请确保确实如此,整个事情都是“ grip”)。如果不是,它将加载并应用所有纹理,但将“叶片”保留为白色。

此OBJ是一个部分(没有“刀片”材料):https://i.imgur.com/h6nWfpK.png

此OBJ由两部分组成(具有“刀片”):https://i.imgur.com/D8JyxHE.png

    var mtlLoader = new THREE.MTLLoader();
    mtlLoader.setTexturePath('/textures/');
    mtlLoader.setPath('/textures/');
    mtlLoader.load("./mtl/" + item + ".mtl", function (materials) {
        scene.background = (new THREE.TextureLoader).load("bg.jpg")
        materials.preload();

        materials.materials.grip.shininess = 50;


        var objLoader = new THREE.OBJLoader();
            objLoader.setMaterials(materials);
            objLoader.setPath('/models/');
            objLoader.load(item + ".obj", function (object) {
                if("blade" in materials.materials){
                    materials.materials.blade = materials.materials.grip;
                    materials.materials.blade.name = "grip";
                    materials.materials.blade.shininess = 200;
                } 
                scene.add(object);
            });

    });

    var animate = function () {
        requestAnimationFrame(animate);
        controls.update();
        renderer.render(scene, camera);
    };

我还要感谢其他任何技巧,因为这是我的第一个threeJS项目! :)

0 个答案:

没有答案