骨骼动画(第2部分–节点层次结构、插值)

我将继续描述在 Flame Steel Engine 中实现的骨骼动画算法。

由于该算法是我实现的所有算法中最复杂的,因此有关开发过程的注释中可能会出现错误。在上一篇关于该算法的文章中,我犯了一个错误;骨骼数组被单独传输到每个网格的着色器,而不是整个模型。

节点层次结构

为了使算法正常工作,模型必须包含骨骼之间的连接(图)。让我们想象一下同时播放两个动画的情况 –跳起来并举起你的右手。跳跃动画必须沿 Y 轴抬起模型,而手臂抬起动画必须考虑到这一点并在模型跳跃时随模型上升,否则手臂将自行保持在原位。

我们将描述这种情况下的节点连接–身体包含手。在制定算法时,将读取骨骼图,所有动画都将被考虑到正确的连接。在模型的内存中,图形与所有动画分开存储,只是为了反映模型骨骼的连接性。

CPU 上的插值

上一篇文章我讲述了渲染骨骼动画的原理—— “每个渲染帧变换矩阵都会从 CPU 传输到着色器。”

每个渲染帧都在 CPU 上进行处理;对于每个网格骨骼,引擎都会使用位置插值、旋转和缩放接收最终的变换矩阵。在对最终骨骼矩阵进行插值时,会遍历所有活动节点动画的节点树,最终矩阵与父矩阵相乘,然后发送到顶点着色器进行渲染。

向量用于位置插值,四元数用于旋转;因为与欧拉角不同,它们非常容易插值 (SLERP),而且也很容易表示为变换矩阵。

如何简化实施

为了更轻松地调试顶点着色器,我使用 FSGLOGLNEWAGERENDERER_CPU_BASED_VERTEX_MODS_ENABLED 宏在 CPU 上添加了顶点着色器的模拟。显卡制造商 NVIDIA 有一个用于调试着色器代码的实用程序 Nsight,也许它也可以简化复杂的顶点/像素着色器算法的开发,但我始终无法在 CPU 上测试其功能;

在下一篇文章中,我计划描述混合多个动画并填补剩余的空白。

来源

https://www.youtube.com/watch?v= f3Cr8Yx3GGA

Leave a Comment

Your email address will not be published. Required fields are marked *