Получение весовых позиций из позы вершины в MD5Mesh - PullRequest
0 голосов
/ 27 декабря 2018

Последние несколько дней я пытался выяснить, как обратить некоторые старые модели из игры, в которую я играл раньше.Проблема в том, что они в формате, который в принципе не существует, и мне нужно сделать «конвертер».Я решил преобразовать модели в форматы 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.

...