Добавление текстуры в материал OBJ, загруженный из файла MTL после того, как он был kiaded - PullRequest
0 голосов
/ 12 октября 2018

Я сделал просмотрщик, который загружает файл 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!:)

...