Последние несколько дней я пытался выяснить, как обратить некоторые старые модели из игры, в которую я играл раньше.Проблема в том, что они в формате, который в принципе не существует, и мне нужно сделать «конвертер».Я решил преобразовать модели в форматы md5mesh и md5anim из Quake, потому что они, по крайней мере, достаточно популярны для дальнейшего преобразования и достаточно близки к текущим моделям, которые я использую.Мне нужно сохранить кости из текущей модели, и они сформированы с использованием списка весов, относящихся к отдельным вершинам.
Чтобы преобразовать их, мне нужно выяснить, как найти веса из вершиныпозиция.У меня есть все переменные, КРОМЕ для весовых позиций.У меня есть положения суставов и ориентации, у меня есть положение вершины, и у меня есть отклонения для каждого веса.Мне нужен какой-то способ их использования для составления списка соответствующих весовых позиций.
Способ, которым модели MD5 получают свои вершины, - это использование весов, соединений, которым они принадлежат, и их соответствующих весов:
glm::quat quat_computew (glm::vec3 q) {
float t = 1.0f - (q.x * q.x) - (q.y * q.y) - (q.z * q.z);
if (t < 0.0f) return glm::quat(0.0f, q.x, q.y, q.z);
return glm::quat(-sqrt(t), q.x, q.y, q.z);
}
glm::vec3 get_vertex_pos(Weight* weights, std::map<int, Joint>& joints, size_t num_weights) {
glm::vec3 final_pos(0, 0, 0);
for (int i = 0; i < num_weights; i++) {
Weight weight = weights[i];
Joint joint = joints[weight.joint];
glm::quat orientation = quat_computew(joint.orient);
glm::vec3 jt = orientation * weight.pos * glm::conjugate(orientation);
final_pos += jt * weight.pos * weight.bias;
}
return final_pos;
}
Но я не могу при жизни понять, как изменить это уравнение.Я перепробовал множество вещей и просто экспериментировал с ним в течение последней недели или около того, пытаясь точно выяснить, что он делает и как я мог бы обратить его вспять, но безрезультатно.
Я использую C ++ и GLM.