Скелетная анимация, умножение трансформации

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

Я сделал анимацию, в которой только часть персонажа имеет кости. На этом изображении крупье имеет машущую руку, но она машет не в том месте по сравнению с остальными крупье. (Вы едва видите это между его ног)

Анимированный крупье

Я попытаюсь обрисовать основы моего матричного вычисления, чтобы увидеть, делаю ли я что-то не так.

Вычисление матрицы абсолютной и относительной анимации для конкретной кости (на основе данных матрицы ключевых кадров):

        if (b == this->root) {
                b->absoluteMatrix = M;
            } else {
                b->absoluteMatrix = b->parent->absoluteMatrix * M;
            } 

            b->skinningMatrix = b->absoluteMatrix * inverse(b->offsetMatrix);       

            if (this->currentAnimationTime == 0) {
                cout << "Bone '" << b->name << "' skinningMatrix:\n";
                printMatrix(b->skinningMatrix);

                cout << "Bone '" << b->name << "' absoluteMatrix:\n";
                printMatrix(b->absoluteMatrix);

                cout << "Bone '" << b->name << "' offsetMatrix:\n";
                printMatrix(b->offsetMatrix);

                cout << "---------------------------------\n";
            }

skinningMatrix, который я отправляю в графический процессор. Это печатает следующее:

вывод из отладки

где offsetMatrix - это преобразование, которое преобразуется из пространства сетки в пространство кости в позе связывания.

В моем шейдере я тогда делаю:

layout(location = 0) in vec4 v; // normal vertex data
newVertex = (skinningMatrix[boneIndex.x] * v) * weights.x;
newVertex = (skinningMatrix[boneIndex.y] * v) * weights.y + newVertex;
newVertex = (skinningMatrix[boneIndex.z] * v) * weights.z + newVertex;

Любые намеки на то, что может быть не так с моими вычислениями?

1 ответ

В настоящее время я сам работаю над скелетной анимацией, и единственное, что я заметил, может возникнуть проблема с тем, как вы используете матрицу смещений из ASSIMP. Рассматриваемая матрица представляет собой матрицу, которая "трансформируется из пространства сетки в пространство кости в позе связывания".

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

Когда вы инвертируете матрицу, вы снова трансформируете вершины в пространство модели, а затем, когда ваши текущие анимационные кадры создают глобальную совместную позу, вы продвигаете вершины еще дальше.

Я полагаю, что ваше решение будет состоять в том, чтобы удалить инвертирование матрицы смещения, что приведет к тому, что ваши вершины переместятся из "модель-соединение-модель".

Другие вопросы по тегам