Direct X 12 – Character Animation 角色动画

23.6 总结

1. 我们在游戏中模拟的许多现实世界中的物体都由父子关系的各个部分所组成,其中子物体可以独立移动,但是当其父物体移动时其也会被强制移动。例如,坦克的炮管可以自行转动,但是其仍然是固定在坦克上的,且会随着坦克移动而移动。另一个经典的例子就是骨骼结构,一些骨头附加于另一些骨头,当父骨头移动时子骨头也会移动。假设我们游戏中的角色在火车中。角色可以自行在火车中移动,但是角色也会随着火车的移动而移动。这个例子告诉我们,在游戏中,层级结构可以动态改变并且必须每一帧被更新。也就是说,在角色进入火车之前,火车并不是角色的层级结构的一部分,但是当角色进入火车之后,火车便会成为角色的层级结构的一部分(角色将会“继承”火车的位移)。

2. 每个处于网格结构体中的物体都处于其本地坐标系,且物体间的连接点就是旋转的原点。因为这些坐标系位于同一个空间,我们可以将它们进行关联,并且将一个坐标系转换为另一个。而我们将这些坐标系与它们的父物体的坐标系进行关联。这样我们就能构建一个to-parent转换矩阵,其能够将一个物体从其本地空间转换至其父物体的空间。以此类推,我们可以不断转换其坐标系直到其位于世界空间。换句话说,为了将位于网格层级中的物体由其本地空间转换至世界空间,我们将使用其to-parent转换矩阵,并且向上遍历所有的父节点。这样,该物体才会“继承”其父物体的位移。

3. 骨骼结构中第i根骨头的to-root转换等式为toRoot(i)=toParent(i)·toRoot(p)p表示第i根骨头的父骨头的索引。

4. 骨头补偿(bone-offset)转换矩阵能够将顶点从绑定空间转换至骨头所在的空间。在骨骼结构中,每一根骨头都拥有一个补偿转换矩阵。

5. 骨骼拥有层级结构的,但是蒙皮网格模型却是一个连续的网格,也就是说可能会有多根骨头影响一个顶点。我们将骨头影响顶点的程度称之为骨头权重。在demo中我们约定,最多有4根骨头影响一个顶点,被转换后的顶点v’,其位于骨骼的根节点所在的空间,转换公式为v’=w(0)vF(0)+w(1)vF(1)+w(2)vF(2)+w(3)vF(3),且w(0)+w(1)+w(2)+w(3)=1。通过使用连续的网格模型以及多个含有权重的骨头,我们能够模拟出更有“弹性”的皮肤效果。

6. 为了实现顶点融合,我们将会存储final转换矩阵的数组,其中包含了每根骨头的final转换矩阵(我们将该数组称之为矩阵调色盘matrix palette)。(第i根骨头的final转换矩阵为F(i)=offset(i)·toRoot(i)。)之后,对于每一个顶点,我们会存储一组权重值以及matrix pallette的索引。而顶点的matrix palette中所存储的索引表示会影响该顶点的骨头的final转换矩阵的索引。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据