我制作了一个加载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项目! :)