使用OBJLoader和MTLLoader,我试图将我从互联网上下载的低多边形汽车模型加载到我的Three.JS场景中。这个模型甚至没有纹理。然而,虽然我确实看到了模型,但是我没有看到它上面的材料(截图上的右侧车)。我在Blender中打开了.obj
文件,我确实在Cycles渲染中看到了低聚车的颜色。
材料 已加载,因为当我console.log
ObjMtlLoader.load
返回的值时(参见下面的代码),我可以看到材质名称,颜色值对应到MTL文件中的内容。
说实话,我并不完全确定OBJLoader
或MTLLoader
是一个问题,因为我尝试了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);
});
这是截图:
答案 0 :(得分:0)
出于某种原因,ThreeJS(或者我所拥有的ThreeJS版本)不喜欢多材料。当我在Blender中按材质分割网格时,一切看起来都很正常。