我已经实现了一个骨架动画系统,我似乎错过了最后一个细节,以使其正常工作。
我做了一个动画,只有角色的一部分有骨头。在这张照片中,火柴人有一个挥动的手臂,但是与火星人的其他部分相比,手臂在错误的位置挥动。 (你几乎看不到他的双腿)
我将尝试概述矩阵计算的基础知识,看看我是否做错了。
计算骨骼特定的绝对和相对动画矩阵(基于我的关键帧矩阵数据):
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;
关于我的计算可能出错的任何提示?
答案 0 :(得分:0)
我目前正在研究骨骼动画,我注意到的唯一可能是问题的是你如何使用ASSIMP的偏移矩阵。所讨论的矩阵是“在绑定姿势中从网格空间转换到骨骼空间”的矩阵。
据我所知,这个矩阵旨在“按原样”使用,这将基本上将你的顶点带入骨骼局部空间,你将乘以一个“新的”全局关节姿势,它将从顶部获取顶点骨空间来模拟空间。
当您反转矩阵时,您正在将顶点变换为模型空间再次,而不是使用当前动画帧全局关节姿势,进一步推动顶点。
我相信您的解决方案是移除偏移矩阵的反转,这将导致您的顶点从“模型 - 关节模型”移动。