Как получить абсолютную матрицу каждой кости? - PullRequest
1 голос
/ 02 февраля 2012

Я работаю с C и OpenGL. Я пытаюсь загрузить 3D-модель с помощью скелетной анимации, но я просто не могу рассчитать абсолютную матрицу каждой кости для каждого кадра анимации.

У меня есть: для каждой кости у меня есть матрица и обратная матрица, а для каждого кадра анимации у меня есть вращение (Эйлер) и перевод для каждой кости.

Сценарии импорта / экспорта в Blender:

http://pastebin.com/xMJ2fG26

http://pastebin.com/9D42RKRf

edit: если кто-то знает, как получить абсолютную матрицу кости с помощью Blender и экспортировать ее, это тоже будет хорошо (я новичок в Blender)

for each frame f
    for each bone i
        glLoadIdentity();
        glMultMatrixd(bones[i].matrix);
        for each parent bone ii(starting from the top)
            glTranslated(bones[ii].translation[f].x, bones[ii].translation[f].y, bones[ii].translation[f].z);
            glRotated(bones[ii].degrees[f].z, 0.0, 0.0, 1.0);
            glRotated(bones[ii].degrees[f].x, 1.0, 0.0, 0.0);
            glRotated(bones[ii].degrees[f].y, 0.0, 1.0, 0.0);
        glMultMatrixd(bones[i].inversematrix);
        glGetDoublev(GL_PROJECTION_MATRIX, bones[i].absmatrix[f]);

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

В своем комментарии к Лоуренсу вы правы в том, что ваши сценарии 2.4 не будут работать для Blender 2.5. Однако ваша проблема не очень сложна. Матрицы, которые вы получаете, представляют собой локальное преобразование каждой кости в следующую. Поэтому все, что вам нужно сделать, это умножить их один за другим в дереве зависимостей.

То, что вы делаете - это обход дерева в глубину, и для каждой итерации вниз по дереву вы рекламируете glPushMatrix(); glMultMatrix(bone_matrix);, а когда поднимаетесь на шаг, меняете эффект на glPopMatrix();

0 голосов
/ 02 февраля 2012

Эти скрипты выглядят так, как будто они написаны для устаревших версий 2.4 * x * Blender. Для 2.5 * x * / 2.6 * x * у вас есть значительно улучшенный API Python, который включает Bone объекты с атрибутами «matrix» и «matrix_local».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...