我正在尝试在我正在编写的小程序中实现骨架动画。我们的想法是通过插入关键帧数据来计算每帧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;
但目前我大多只是困惑,任何正确方向的推动都会有所帮助。我真的需要让这个订单正确...