Скелетная анимация, умножение трансформации
Я реализовал систему скелетной анимации, в которой мне, кажется, не хватает одной последней детали для ее правильной работы.
Я сделал анимацию, в которой только часть персонажа имеет кости. На этом изображении крупье имеет машущую руку, но она машет не в том месте по сравнению с остальными крупье. (Вы едва видите это между его ног)
Я попытаюсь обрисовать основы моего матричного вычисления, чтобы увидеть, делаю ли я что-то не так.
Вычисление матрицы абсолютной и относительной анимации для конкретной кости (на основе данных матрицы ключевых кадров):
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. Рассматриваемая матрица представляет собой матрицу, которая "трансформируется из пространства сетки в пространство кости в позе связывания".
Насколько мне известно, эта матрица предназначена для использования "как есть", которая по существу перенесет ваши вершины в локальное пространство костей, которое вы затем умножите на "новую" глобальную позу сустава, которая перенесет вершины из костного пространства в модельное пространство.
Когда вы инвертируете матрицу, вы снова трансформируете вершины в пространство модели, а затем, когда ваши текущие анимационные кадры создают глобальную совместную позу, вы продвигаете вершины еще дальше.
Я полагаю, что ваше решение будет состоять в том, чтобы удалить инвертирование матрицы смещения, что приведет к тому, что ваши вершины переместятся из "модель-соединение-модель".