После экспорта анимированный экземпляр очищенной сетки становится деформированным - PullRequest
0 голосов
/ 17 апреля 2019

То, что я пытаюсь сделать, это экспортировать очищенную сетку, которая изменила позиции, потому что я ее анимировал.

Я получил следующий код от: Как вычислить преобразованные вершины скина? https://gist.githubusercontent.com/jcarletto27/35b19f811c657ec73b0238d78413f88d/raw/e43389b2851c7a5cfcd284ff4ced9461c79f52d7/OBJExporter.js и [этот вопрос] Экспорт сцены Three.js в STL, сохраняя анимацию без изменений.

Эти ссылки говорят мне, что я должен пройти по вершинам, которые изначально находятся в позе связывания, найти кости, которые влияют на каждую вершину (может быть не более 4 костей), преобразовать позиции этих вершин вкостное пространство, а затем в глобальное пространство, и, наконец, применить новые весовые коэффициенты (насколько каждая кость влияет на эту вершину) на них.

для (i = 0, l = vertices.count; i

   vertex.x = vertices.getX(i);
   vertex.y = vertices.getY(i);
   vertex.z = vertices.getZ(i);                                                              
   vertex.applyMatrix4(mesh.matrixWorld);
   skinIndex = [];
   skinIndex[0] = skinIndices.getX(i);
   skinIndex[1] = skinIndices.getY(i);
   skinIndex[2] = skinIndices.getZ(i);
   skinIndex[3] = skinIndices.getW(i);

   skinWeight = [];
   skinWeight[0] = weights.getX(i);
   skinWeight[1] = weights.getY(i);
   skinWeight[2] = weights.getZ(i);
   skinWeight[3] = weights.getW(i);

   inverses = [];
   inverses[0] = mesh.skeleton.boneInverses[skinIndex[0]];
   inverses[1] = mesh.skeleton.boneInverses[skinIndex[1]];
   inverses[2] = mesh.skeleton.boneInverses[skinIndex[2]];
   inverses[3] = mesh.skeleton.boneInverses[skinIndex[3]];

   skinMatrices = [];
   skinMatrices[0] = mesh.skeleton.bones[skinIndex[0]].matrixWorld;
   skinMatrices[1] = mesh.skeleton.bones[skinIndex[1]].matrixWorld;
   skinMatrices[2] = mesh.skeleton.bones[skinIndex[2]].matrixWorld;
   skinMatrices[3] = mesh.skeleton.bones[skinIndex[3]].matrixWorld;
   var finalVector = new THREE.Vector4();

   for (var k = 0; k < 4; k++) {

       var tempVector = new THREE.Vector4(vertex.x, vertex.y, vertex.z);

           tempVector.applyMatrix4(inverses[k]);
          tempVector.applyMatrix4(skinMatrices[k]);
          tempVector.multiplyScalar(skinWeight[k]);

          finalVector.add(tempVector);
   }

   output += 'v ' + finalVector.x + ' ' + finalVector.y + ' ' + finalVector.z + '\n';
                    }

То, что у меня есть, дает мне вывод, который выглядит следующим образом: деформирован

Когда это должно выглядеть так (обычный штурмовик): не деформировано

Помимо кода, мне интересно, что может быть не так с сеткой (это нормали, неправильная обратная матрица и т. Д.) - если кто-тоспособный визуально идентифицировать это.Поскольку вы можете увидеть некоторые атрибуты сетки (пальцы, шлем), если вы приблизитесь.

В любом случае, я впервые пишу о переполнении стека, спасибо всем за чтение.

...