我已经实现了一个骨骼动画系统,我似乎遗漏了最后一个细节以使其正常工作。
我制作了一个动画,其中只有一部分角色有骨骼。在这张图片中,火柴人有一只挥动的手臂,但与火柴人的其余部分相比,手臂挥动的位置错误。(你几乎看不到他的腿之间)
我将尝试概述我的矩阵计算的基础知识,看看我是否做错了什么。
计算骨骼特定的绝对和相对动画矩阵(基于我的关键帧矩阵数据):
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";
}
我发送到 GPU 的 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;
关于我的计算可能有什么问题的任何提示?