骨骼动画,变换乘法

时间:2013-08-17 10:30:43

标签: opengl animation glsl skeletal-mesh

我已经实现了一个骨架动画系统,我似乎错过了最后一个细节,以使其正常工作。

我做了一个动画,只有角色的一部分有骨头。在这张照片中,火柴人有一个挥动的手臂,但是与火星人的其他部分相比,手臂在错误的位置挥动。 (你几乎看不到他的双腿)

Animated stickman

我将尝试概述矩阵计算的基础知识,看看我是否做错了。

计算骨骼特定的绝对和相对动画矩阵(基于我的关键帧矩阵数据):

        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。这将打印以下内容:

output from debugging

其中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 个答案:

答案 0 :(得分:0)

我目前正在研究骨骼动画,我注意到的唯一可能是问题的是你如何使用ASSIMP的偏移矩阵。所讨论的矩阵是“在绑定姿势中从网格空间转换到骨骼空间”的矩阵。

据我所知,这个矩阵旨在“按原样”使用,这将基本上将你的顶点带入骨骼局部空间,你将乘以一个“新的”全局关节姿势,它将从顶部获取顶点骨空间来模拟空间。

当您反转矩阵时,您正在将顶点变换为模型空间再次,而不是使用当前动画帧全局关节姿势,进一步推动顶点。

我相信您的解决方案是移除偏移矩阵的反转,这将导致您的顶点从“模型 - 关节模型”移动。