OpenGL:骨骼动画,为什么在与GPU一起工作时需要绑定姿势的逆变换?

13

我使用软件蒙皮实现了一个MD5加载器。MD5的初始姿态是最终的、绝对的位置和旋转,你只需要为依赖于关节的权重进行计算。

我尝试实现GPU蒙皮,但卡在了一个点上。由于这些坐标是最终的,为什么我不能将我的3D向量和四元数转换成矩阵,然后直接上传到着色器中呢?正如我在这里阅读到的:http://3dgep.com/?p=1356,我需要将我的骨架与绑定姿态的逆矩阵相乘。但我不理解这一部分,因为我一直以为我只需要上传最终的矩阵到GPU中,在那里计算剩余部分(权重等等)即可。

你能解释一下逆绑定姿态的行为吗?

2个回答

25
作为该文章的原作者,我将尝试解释什么是乘以逆绑定姿态:
“逆绑定姿态”基本上“撤消”了已经应用于模型绑定姿态的所有变换。
可以这样理解: 如果您向模型中的每个关节应用单位矩阵,则得到的是模型的绑定姿势(您可以通过发送带有单位矩阵的骨架帧来尝试。如果结果是绑定姿势,则操作正确)。
如果您在模型中的每个关节上应用绑定姿态矩阵(未反转),则得到的是一堆混乱的东西,因为您会将绑定姿态应用两次!
为了修复混乱的模型,只需将结果关节变换乘以逆绑定姿态即可“撤销”已经应用于模型的变换。
希望这能使问题更加清晰...

11

说实话,这篇文章有点难以彻底理解。似乎反向绑定姿势矩阵用于将顶点转换为骨骼的本地坐标系。

这是必要的,因为骨骼的变换是本地的(相对于它们的父关节)。所以为了对顶点进行动画处理,您必须将其转换为骨骼的本地坐标系,计算骨骼的本地变换,并将其转换回世界系统。


那个时候,我认为我理解了背后的思想。我们已经上传了绑定姿势的顶点,我只需要根据当前的骨架对它们进行变换。由于我的所有顶点已经在世界空间中,我需要将新骨架的绝对矩阵转换为关节空间,因为我需要偏移量,然后将结果乘以我的顶点,最后再乘以模型视图矩阵。 - deniz
1
嗨,我有一个关于性能的问题。为什么不用绑定姿势的逆矩阵预乘顶点呢?然后骨骼矩阵可以直接作为皮肤的本地到世界变换。这样就不需要每帧都乘以逆绑定姿势了。 - watson
@watson:如果每个顶点受到且仅受到一个骨骼的影响,则这是可能的。但如果有多个骨骼(例如在关节周围),则不再适用,因为反向绑定姿势矩阵对于每个骨骼都是特定的。 - Nico Schertler
谢谢,你是对的。4个矩阵通过权重转换顶点不是线性函数(我不确定?)。因此,在加载时按权重预转换反向绑定姿势矩阵是不正确的。 - watson
还有一个问题:我是将Delta矩阵(骨骼世界矩阵*反向绑定姿势)存储,还是将Delta(偏移量、四元数、缩放)作为动画关键帧存储。这样我就可以避免每帧都要乘以反向绑定姿势了? - watson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接