Opengl 骨骼动画-COLLADA矩阵乘法

Opengl 骨骼动画-COLLADA矩阵乘法,opengl,math,animation,graphics,matrix,Opengl,Math,Animation,Graphics,Matrix,我试图在我正在编写的一个小程序中实现骨骼动画。其思想是通过插值关键帧数据在CPU上计算每帧的变换矩阵,然后将该数据提供给我的顶点着色器,该着色器将我的顶点乘以该矩阵,如下所示: vec4 v = animationMatrices[int(boneIndices.x)] * gl_Vertex * boneWeights.x; public void Draw() { GL.PushMatrix(); drawBone(Root); GL.PopMatrix(); }

我试图在我正在编写的一个小程序中实现骨骼动画。其思想是通过插值关键帧数据在CPU上计算每帧的变换矩阵,然后将该数据提供给我的顶点着色器,该着色器将我的顶点乘以该矩阵,如下所示:

vec4 v = animationMatrices[int(boneIndices.x)] * gl_Vertex * boneWeights.x;
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 * b.Parent.jointMatrix;
其中,boneWeights和BoneIndicates是属性,AnimationMatrix是绘制前每帧更新的变换矩阵的统一数组。(这个想法是让多个骨骼最终影响一个顶点,但现在我用每个顶点一个骨骼进行测试,所以只需要取weight.x和index.x就足够了)

现在的问题是计算每个骨骼的变换矩阵。我的单关节变换矩阵很好,问题是它总是以(0,0,0)作为轴,而不是轴。我从COLLADA中提取了关节矩阵,当我像这样绘制它们时,它正确地显示了我的骨架:

vec4 v = animationMatrices[int(boneIndices.x)] * gl_Vertex * boneWeights.x;
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 * b.Parent.jointMatrix;
现在来计算我尝试过的实际矩阵:

Matrix4 jointMatrix = b.restMatrixInv * boneTransform * b.restMatrix;
或者根据collada文档(这对我来说没什么意义):

我知道我还要把父矩阵放在这里的某个地方,我猜是这样的:

vec4 v = animationMatrices[int(boneIndices.x)] * gl_Vertex * boneWeights.x;
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 * b.Parent.jointMatrix;

但目前我大部分都很困惑,任何朝着正确方向的努力都会有所帮助。我真的需要把这个顺序弄对…

让我知道这个答案是否能帮助你:[旋转中心][1][1]:这是我在第一条jointMatrix行中已经做过的,但当我尝试时,它仍然可以在(0,0,0)左右缩放(在本例中,这就是我正在测试的)。这可能与restMatrix有关,但在绘制骨架时,它看起来还可以。