То, что я пытаюсь сделать, это экспортировать очищенную сетку, которая изменила позиции, потому что я ее анимировал.
Я получил следующий код от: Как вычислить преобразованные вершины скина? 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';
}
То, что у меня есть, дает мне вывод, который выглядит следующим образом: деформирован
Когда это должно выглядеть так (обычный штурмовик): не деформировано
Помимо кода, мне интересно, что может быть не так с сеткой (это нормали, неправильная обратная матрица и т. Д.) - если кто-тоспособный визуально идентифицировать это.Поскольку вы можете увидеть некоторые атрибуты сетки (пальцы, шлем), если вы приблизитесь.
В любом случае, я впервые пишу о переполнении стека, спасибо всем за чтение.