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

时间:2015-02-21 20:16:08

标签: javascript matrix webgl skeletal-animation gl-matrix

我无法找到骨骼的最终骨基质。

我知道我的绑定姿势矩阵有效,而且我知道我的变换矩阵有效,但我想将它们相乘(我称之为复合矩阵)然后乘以它们的父复合矩阵(然后乘以它的父节点)等等)会得到正确的矩阵。

值得注意的是我使用gl-matrix.js作为我的矢量/矩阵数学库,它的矩阵数学反向工作,得到一个世界矩阵需要, PositionMatrix * RotationMatrix * ScaleMatrix,而不是相反。所以我可能会把订单搞砸了,

我尝试更改绑定姿势矩阵和骨骼变换矩阵的乘法顺序,以及最终矩阵和父矩阵的顺序,但我现在只是心神不定。

无论如何要把这个问题包起来, 给定一个网格,其中每个顶点都预先转换为其相对骨骼空间,每个骨骼绑定姿势矩阵,每个骨骼每帧变换矩阵如何找到最终的骨骼矩阵?

修改

仍然有问题,但它可能有助于说我现在在哪里,下面的伪代码将模型完美地融入其绑定姿势

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

上面的代码片段到底是什么,而不需要解释矩阵函数(它的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)

我会得到最终的矩阵(我尝试在poseMatrices之前使用transformMatrices),但我得到的只是一个脊椎断裂和内侧腿的模型

编辑2:

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

1 个答案:

答案 0 :(得分:2)

事实证明矩阵的奇怪性是整个问题,进一步检查引导我进行四元数旋转以及它们是如何从搅拌机输出的(我自己的文件类型因此我的坏)我没注意到搅拌机有它的格式化的四元数(W,X,Y,Z)其中gl-matrix.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)