我很难为我的骨骼找到最终的骨骼矩阵。
我知道我的绑定姿势矩阵有效,并且我知道我的变换矩阵有效,但我认为将它们相乘(我称之为复合矩阵)然后将它们乘以其父复合矩阵(然后乘以它的父父等)会给我正确的矩阵。
值得注意的是,我使用 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 行倒置?奇怪,但我正在研究如果我现在把它们换回去会发生什么