Как я могу предотвратить объединение всех частей моего объекта OBJLoader Three.js в 1 меш? - PullRequest
1 голос
/ 10 октября 2019

Хорошо, я застрял в этом вопросе на какое-то время, поэтому я здесь.

У меня есть файл .obj, созданный одним из моих коллег, который мне нужно загрузить вThree.js сцена. Мне нужно иметь возможность изменять материалы и текстуру отдельных частей указанного объекта. Только когда я попытался загрузить этот .obj в three.js и записать в него загруженный объект, я заметил, что он сливается в 1 меш.

Я искал ответ на эту проблему, ноЯ даже не нашел человека с такой же проблемой, как у меня. В настоящее время я загружаю .obj, и он .mtl выглядит следующим образом:

loadMTL = (mtlLoader, mtlPath, texPath, loader, objPath) => {
    mtlLoader.load(
      mtlPath,
      mat => {
        mat.preload();

        loader.setMaterials(mat);
        loader.load(
          objPath,
          object => {
            console.log(object);

            this.scene.add(object);

          },
          // called when loading is in progresses
          function(xhr) {
            // console.log("Obj - " + (xhr.loaded / xhr.total) * 100 + "% loaded");
          },
          // called when loading has errors
          function(error) {
            console.log("An error happened loading an OBJ");
            console.log(error);
          }
        );
      },
      // called when loading is in progresses
      function(xhr) {
        // console.log("Mat - " + (xhr.loaded / xhr.total) * 100 + "% loaded");
      },
      // called when loading has errors
      function(error) {
        console.log("An error happened loading a MTL");
        console.log(error);
      }
    );
  };

Я использую OBJLoader - OBJLoader Three.js, а не OBJLoader2. В результате вывод журнала будет следующим:

Group {uuid: "DCA4C797-A66E-4007-ADAF-C4060FD9D886", name: "", type: "Group", parent: null, children: Array(1), …}
        castShadow: false
        children: Array(1)
               0: Mesh {uuid: "76EA3F31-CB49-4D5F-A95C-B45A751DFBBE", name: "Kamer", type: "Mesh", parent: Group, children: Array(0), …}
            length: 1
            __proto__: Array(0)
        frustumCulled: true
        layers: Layers {mask: 1}
        materialLibraries: ["Kastje1_test.mtl"]
        matrix: Matrix4 {elements: Array(16)}
        matrixAutoUpdate: true
        matrixWorld: Matrix4 {elements: Array(16)}
        matrixWorldNeedsUpdate: false
        name: ""
        parent: null
        position: Vector3 {x: 20, y: 0, z: 0}
        quaternion: Quaternion {_x: -0.7071067811865475, _y: 0, _z: 0, _w: 0.7071067811865476, _onChangeCallback: ƒ}
        receiveShadow: false
        renderOrder: 0
        rotation: Euler {_x: -1.5707963267948966, _y: 0, _z: 0, _order: "XYZ", _onChangeCallback: ƒ}
        scale: Vector3 {x: 33, y: 70, z: 55}
        type: "Group"
        up: Vector3 {x: 0, y: 1, z: 0}
        userData: {}
        uuid: "DCA4C797-A66E-4007-ADAF-C4060FD9D886"
        visible: true
        eulerOrder: (...)
        id: 20
        modelViewMatrix: Matrix4 {elements: Array(16)}
        normalMatrix: Matrix3 {elements: Array(9)}
        useQuaternion: (...)
        __proto__: Object3D

Как видите, в группе есть только 1 дочерняя сетка. У этой сетки больше нет детей. Проблема заключается в том, что мне нужно повторить некоторые части объекта, поскольку он имеет только 1 меш, а указанная сетка может иметь только 1 текстуру, насколько я знаю, я не знаю, как действовать дальше. Есть ли какая-то фундаментальная концепция Three.js, которую я упускаю?

РЕДАКТИРОВАТЬ:

После дополнительных поисков мы выяснили, что пошло не так: очевидно, мой коллега определил только одну группу в .objфайл. Мы исправили файл .obj, и теперь я получаю разные сетки.

...