Как рассчитать окончательную матрицу кости в скелетной анимации?

У меня проблемы с поиском окончательных матриц костей для моего скелета.

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

Стоит отметить, что я использую gl-matrix.js в качестве моей математической библиотеки векторов / матриц, математика ее матриц работает в обратном порядке, для получения мировой матрицы требуется PositionMatrix * RotationMatrix * ScaleMatrix, а не наоборот. так что я могу перепутать заказы,

Я пробовал изменить порядок умножения матриц позы привязки и матриц преобразования костей, а также порядок конечной матрицы и родительских матриц, но сейчас я просто поражен.

В любом случае, чтобы обернуть этот вопрос в лук, учитывая сетку, в которой каждая вершина предварительно преобразована в ее относительное пространство костей, каждая кость связывает матрицу позы и каждую матрицу преобразования костей на кадр, как мне найти окончательную матрицу костей?

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

все еще есть проблемы, но это может помочь сказать, где я нахожусь в данный момент, следующий псевдокод полностью переводит модель в ее позу привязки

finalBones = []
foreach bone in bones
    mat = bone.poseMatrix
    parent = bone
    while (parent.parent != null)
        parent = parent.parent
        mat *= parent.poseMatrix
    finalBones.push(mat)

приведенный выше фрагмент - это именно то, что происходит без необходимости объяснения функций матрицы (его javascript, поэтому он выполняется с помощью таких функций, как mat4.copy и mat4.mul)

Я подумал, сделал ли я что-то вроде

finalBones = []
foreach bone in bones
    mat = bone.poseMatrix
    mat *= bone.transformMatrix
    parent = bone
    while (parent.parent != null)
        parent = parent.parent
        mat *= parent.poseMatrix
        mat *= parent.transformMatrix
    finalBones.push(mat)

Я бы получил финальную матрицу (и я пробовал использовать transformMatrices перед PoseMatrices), но все, что я получаю, это модель со сломанным позвоночником и вывернутыми наизнанку ногами.

ИЗМЕНИТЬ 2:

Итак, при дальнейшем рассмотрении, матрицы преобразования костей на холостом кадре имеют перевернутые средние 2 строки? странно, но я смотрю, что будет, если я сейчас поменяю их местами


person scott_r_howell    schedule 21.02.2015    source источник
comment
извиняюсь, я не трачу много времени на переполнение стека, исправлю ошибку сейчас.   -  person scott_r_howell    schedule 22.02.2015


Ответы (1)


оказалось, что странность с матрицами была всей проблемой, дальнейшая проверка привела меня к поворотам кватернионов и тому, как они были экспортированы из блендера (мой собственный тип файла, поэтому мой плохой) Я не заметил, что блендер отформатировал свои кватернионы (W, X, Y, Z), где gl-matrix.js (математическая библиотека, которую я использую) отформатирована (X, Y, Z, W), несколько настроек загрузки позже, и модель отлично анимируется! для записи этого вопроса здесь был цикл, который, как я обнаружил, работал

finalBones = []
foreach bone in bones
    parent = bone
    mat = identityMatrix
    while (parent.parent != null)
        mat *= parent.transformMatrix
        mat *= parent.poseMatrix
        parent = parent.parent
    finalBones.push(mat)
person scott_r_howell    schedule 22.02.2015