如何计算骨骼动画中的最终骨骼矩阵

How do I calculate the final bone matrix in skeletal animation?

本文关键字:动画 计算 何计算      更新时间:2024-03-08

我很难找到骨骼的最终骨骼矩阵。

我知道我的绑定姿势矩阵是有效的,我也知道我的变换矩阵也是有效的,但我想把它们相乘(我称之为复合矩阵),然后乘以它的父复合矩阵(然后再乘以它的父母,等等),会得到正确的矩阵。

值得注意的是,我使用glmatrix.js作为我的向量/矩阵数学库,它的矩阵数学工作原理相反,需要获得一个世界矩阵,位置矩阵*旋转矩阵*缩放矩阵,而不是相反。所以我可能把订单搞混了,

我试过改变绑定姿势矩阵和骨骼变换矩阵的乘法顺序,以及最终矩阵和父矩阵的顺序,但现在我简直难以置信。

无论如何,用鞠躬来结束这个问题,给定一个网格,其中每个顶点都被预变换到其相对骨骼空间,每个骨骼绑定姿势矩阵和每个骨骼每帧变换矩阵,我如何找到最终的骨骼矩阵?

编辑:

仍然有问题,但这可能有助于说明我目前的处境,下面的psuedo代码使模型完美地进入其绑定姿势

finalBones = []
foreach bone in bones
    mat = bone.poseMatrix
    parent = bone
    while (parent.parent != null)
        parent = parent.parent
        mat *= parent.poseMatrix
    finalBones.push(mat)

上面的snippest正是发生的事情,而无需解释矩阵函数(它的javascript是通过mat4.copy和mat4.mul等函数完成的)

我想如果我做了类似的事情

finalBones = []
foreach bone in bones
    mat = bone.poseMatrix
    mat *= bone.transformMatrix
    parent = bone
    while (parent.parent != null)
        parent = parent.parent
        mat *= parent.poseMatrix
        mat *= parent.transformMatrix
    finalBones.push(mat)

我会得到最终的矩阵(在poseMatrics之前我尝试过使用transformMatrix),但我得到的只是一个脊椎骨折、腿由内向外的模型

编辑2:

因此,在进一步检查时,空闲帧上的骨骼变换矩阵的中间2行是否反转?很奇怪,但我正在研究如果我现在把它们换回来会发生什么。

事实证明,矩阵的奇异性是整个问题,进一步的检查让我了解了四元数旋转以及它们是如何从blender导出的(我自己的文件类型很糟糕)我没有注意到blender有四元数格式(W,X,Y,Z),其中glmatrix.js(我使用的数学库)是格式化的(X,Y、Z,W)稍后对加载进行了一些调整,模型的动画效果很好!为了记录这个问题,这里是我发现有效的循环

finalBones = []
foreach bone in bones
    parent = bone
    mat = identityMatrix
    while (parent.parent != null)
        mat *= parent.transformMatrix
        mat *= parent.poseMatrix
        parent = parent.parent
    finalBones.push(mat)