骨骼动画COLLADA矩阵乘法

时间:2013-11-22 11:11:51

标签: opengl math animation graphics matrix

我正在尝试在我正在编写的小程序中实现骨架动画。我们的想法是通过插入关键帧数据来计算每帧CPU上的变换矩阵,然后将这些数据提供给我的顶点着色器,它将我的顶点乘以这个矩阵,如下所示:

vec4 v = animationMatrices[int(boneIndices.x)] * gl_Vertex * boneWeights.x;

其中boneWeights和boneIndices是属性,而animationMatrices是在绘制之前每帧更新的均匀变换矩阵数组。 (想法是最终有多个骨骼影响一个顶点,但是现在我正在测试每个顶点有一个骨骼,所以只需要使用weight.x和indices.x即可。)

现在问题是计算每个骨骼的变换矩阵。单关节的转换矩阵是好的,问题是它总是需要(0,0,0)作为枢轴而不是枢轴。我从COLLADA中获取了联合矩阵,当我这样画出它时,它正确显示了我的骨架:

public void Draw()
{
    GL.PushMatrix();
    drawBone(Root);
    GL.PopMatrix();
}

private void drawBone(Bone b)
{
    GL.PointSize(50);
    GL.MultMatrix(ref b.restMatrix);
    GL.Begin(BeginMode.Points);
    GL.Color3((byte)0, (byte)50, (byte)0);
    if (b.Name == "Blades")
    {
        GL.Vertex3(0, 0, 0);
    }
    GL.End();
    foreach (Bone bc in b.Children)
    {
        GL.PushMatrix();
        drawBone(bc);
        GL.PopMatrix();
    }
}

现在计算我尝试过的实际矩阵:

Matrix4 jointMatrix = b.restMatrixInv * boneTransform * b.restMatrix;

或根据collada文档(这对我来说没有意义):

Matrix4 jointMatrix = b.restMatrix * b.restMatrixInv * boneTransform;

我知道我也必须将父矩阵放在这里,我猜是这样的:

Matrix4 jointMatrix = b.restMatrixInv * boneTransform * b.restMatrix * b.Parent.jointMatrix;

但目前我大多只是困惑,任何正确方向的推动都会有所帮助。我真的需要让这个订单正确...

0 个答案:

没有答案