Я сделал просмотрщик, который загружает файл OBJ и MTL.
MTL используется только для объединения набора различных текстур, которые применяются к конкретным сеткам в одном файле OBJ.
MTL содержит следующие материалы (например):
- Захват
- Тело (Не имеет значения в этом случае. Всегда статичная текстура)
У OBJ иногда может быть другой материал, который называется «клинок».Этот материал (намеренно) отсутствует в файле MTL.
Если ThreeJS загружает модель с материалом "Blade", он будет применять текстуры к "Grip" и "Body".Материал "Blade" фактически добавлен (потому что он находится в OBJ), но он пуст, поскольку его нет в файле MTL.
Что я пытаюсь сделать:
Я хотел бы проверить, был ли материал "лезвия" создан ThreeJS (присутствует в объекте).Если это так, все настройки, включая текстуры, должны быть скопированы в него из «ручки» (которая всегда будет назначаться и текстурироваться), они обе имеют общую текстуру, только позже блеск меняется динамически.
Вот мой (частично рабочий) код.Если объект не содержит «лезвия», он работает отлично (конечно, тогда все дело в «захвате»).Если это не так, он загружает и применяет все текстуры, но оставляет «лезвие» одним белым.
Этот 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!:)