2

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

我知道我的绑定姿势矩阵有效,并且我知道我的变换矩阵有效,但我认为将它们相乘(我称之为复合矩阵)然后将它们乘以其父复合矩阵(然后乘以它的父父等)会给我正确的矩阵。

值得注意的是,我使用 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 行倒置?奇怪,但我正在研究如果我现在把它们换回去会发生什么

4

1 回答 1

3

事实证明,矩阵的奇怪是整个问题,进一步检查将我引向四元数旋转以及它们是如何从搅拌机中导出的(我自己的文件类型,所以我不好)我没有注意到搅拌机的四元数已格式化(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)
于 2015-02-22T02:50:25.727 回答