我无法找到骨骼的最终骨基质。
我知道我的绑定姿势矩阵有效,而且我知道我的变换矩阵有效,但我想将它们相乘(我称之为复合矩阵)然后乘以它们的父复合矩阵(然后乘以它的父节点)等等)会得到正确的矩阵。
值得注意的是我使用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行是否反转?很奇怪,但是我正在调查如果我现在把它们换回来会发生什么
答案 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)