ThreeJs OBJLoader + MTLLoader:材料负载但不显示

时间:2017-10-25 02:35:05

标签: typescript three.js

使用OBJLoader和MTLLoader,我试图将我从互联网上下载的低多边形汽车模型加载到我的Three.JS场景中。这个模型甚至没有纹理。然而,虽然我确实看到了模型,但是我没有看到它上面的材料(截图上的右侧车)。我在Blender中打开了.obj文件,我确实在Cycles渲染中看到了低聚车的颜色。

材料 已加载,因为当我console.log ObjMtlLoader.load返回的值时(参见下面的代码),我可以看到材质名称,颜色值对应到MTL文件中的内容。

说实话,我并不完全确定OBJLoaderMTLLoader是一个问题,因为我尝试了ColladaLoader(截图上的左侧车) ,除了车轮之外,它也没有显示材料。

我想知道,鉴于这种有限的背景,你是否有任何线索可能是什么原因。我会更深入地研究这个问题,但我已经工作了,比方说,每天10个小时,包括周末。我想如果没什么作用,我会尝试手动创建材料。

以下是代码的摘录:

// obj-mtl-loader.ts

export class ObjMtlLoader {

    private objLoader: THREE.OBJLoader = new THREE.OBJLoader();
    private mtlLoader: THREE.MTLLoader = new THREE.MTLLoader();

    constructor(basePath?: string) {
        if (basePath) {
            this.objLoader.setPath(basePath);
            this.mtlLoader.setPath(basePath);
        }
    }

    public load(objFile: string, mtlFile: string): Promise<THREE.Group> {
        return new Promise((resolve, reject) => {
            this.mtlLoader.load(
                mtlFile,
                (materialCreator) => {
                    materialCreator.preload();
                    this.objLoader.setMaterials(materialCreator);
                    this.objLoader.load(
                        objFile,
                        (model) => {
                            resolve(model);
                        },
                        () => {},
                        (reason) => reject(reason)
                    );
                },
                () => {},
                (reason) => reject(reason)
            );
        });
    }

}

以下是一个示例用法:

// renderer.ts
    new ObjMtlLoader().load(
        '/assets/racing/car_model/Low-Poly-Racing-Car.obj',
        '/assets/racing/car_model/Low-Poly-Racing-Car.mtl'
    ).then((car) => {
        this.SCENE.add(car);
    });

这是截图:

Demo

1 个答案:

答案 0 :(得分:0)

出于某种原因,ThreeJS(或者我所拥有的ThreeJS版本)不喜欢多材料。当我在Blender中按材质分割网格时,一切看起来都很正常。