GAMES104 08.游戏引擎的动画技术基础(下)
蒙皮动画的实现:关节与蒙皮
Joint Pose
Affine Matrix
- Orientation
- 大部分骨骼动画是旋转。
- Position
- Pelvis、特殊的机械结构、facial joints会发生位置的变化。
- Scale
- 对面部进行修改。
Local Space to Model Space
累乘根节点到当前关节的变换矩阵,即可得到当前关节的 model space
的变换矩阵。这就是仿射矩阵的核心。
Local Space vs. Model Space
如果在model space进行插值,进行的是平移变换,那么骨头的长度会发生变换
而在local space进行插值,进行的是旋转,所以此时骨头长度是正常的没有发生长度的变化
Single Joint Skinning
❓在 Joint 发生平移、旋转的时候,我们希望的皮肤上的 mesh 也跟着动,这里数学是怎么映射的?
对于绑定到关节 $J$ 的网格顶点 $V$:
- $V_b^m$:顶点 $V$ 在 绑定姿态 下 模型空间 中的位置。
- $V_b^l$:顶点 $V$ 在 绑定姿态 下 局部空间 中的位置。
- $M_{b(j)}^m$:关节 $J$ 在 绑定姿态 下 模型空间 中的姿态矩阵。
顶点 $V$ 在任意时间 $t$ 的 局部空间 位置固定为:
$ V_b^l(t) \equiv V_b^l = (M_{b(j)}^m)^{-1} \cdot V_b^m $
Skinning Matrix
就是通过这个 skinning matrix
,可以知道与 Joint 绑定的点同一时间在 Local Space
移动后,在 Model Space
的位置。
这是对于单个的点来说,在游戏中,骨骼和顶点的量级差距在几个数量级,这时我们就需要预处理出所有的 skinning matrix
,叫 skinning matrix palette
。
最后,我们再加上从 model space
到 world space
的转换,就得到了最后位置的坐标。
Weighted Skinning with Multi-joints
此时一个点移动后的位置,取决于多个骨骼,一般不超过四个。
❗通过加权平均来计算,多个骨骼的权重之和要等于 $1$ 。
❓如何插值
1
算出依赖的所有节点在模型空间的坐标,然后加权插值,注意插值要在模型空间。
Interpolation
对于位移和 Scale
,使用线性插值就可以。但是旋转就不行,需要在插值的基础上再做一个 Normalization
,叫做NLERP。
Shortest Path Fixing of NLERP
当 $q_{t1} \cdot q_{t2} \geqslant 0$ 说明是测地线(球面上的短边)
SLERP
效果更好的旋转插值,但是花费很大,因为涉及到三角函数了。
所以会设定一个阈值,小于阈值就使用 NLERP,大于阈值就使用 SLERP 。
动画压缩技术
Simple Animation Runtime Pipline
Animation Compression
动画需要存储的数据非常多:
- 每帧关节的平移、放缩和旋转
- 一秒三十帧
但是,很多数据是不变的。所以我们丢弃一些数据:
- 不变的track,比如scale track,在人形骨骼中,除了面部基本都不会变。
- 丢弃掉translate track,在人形骨骼中,除了pelvis、facial joint和特殊的joints外也基本不变
Keyframe Extraction
假设当前帧为 $i$ ,用 $i -1$ 和 $i+1$ 插值算出的值与 $i$ 插值较小,则把 $i$ 删除。
Catmull-Rom Spline
类似贝塞尔曲线的东西,感觉视频有动图讲的更清楚🔗
Quantization
Float Quantization
从大的区间范围映射到小的区间范围。就能缩减所用数据类型的大小。
Quaternion Quantization
三数表示单位四元数: 对于单位四元数 $q = (a, b, c, \sqrt{1 - (a^2 + b^2 + c^2)})$,只需要三个数来表示它。第四个分量 $d$ 可以由其他三个分量通过单位模约束计算得出。
范围限制: 通过始终省略绝对值最大的分量,剩下的三个分量的范围可以限制在 $\left[ -\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}} \right]$ 之间。
- 分量范围的推导:
- 由于 $a^2 + b^2 + c^2 + d^2 = 1$,当 $|a| \geq \max(|b|, |c|, |d|)$ 时,剩下的分量(例如 $b$)必须满足: $ b^2 \leq \frac{1}{2} $
- 这意味着: $ -\frac{1}{\sqrt{2}} \leq b \leq \frac{1}{\sqrt{2}} $
- 同理,这个范围限制也适用于 $c$ 和 $d$。
实际运用
46 45 用来存储四元数中哪个是最大值
44-30、29-15、14-0分别存另外三个数
Error Propagation
压缩之后会掉精,error 就会在关节之间传递,传递次数越多,error 就会变得非常恐怖。
Measuring Accuracy
定义两个垂直于关节的点,与 offset 进行比较,来量化 error 的程度。
Error Compensation
没听太懂,讲的好像是修正 error 时会产生的错误效果。
动画制作流程
Mesh Building 在关节处,Mesh的精度会更高一些。
Skeleton Binding 利用引擎快速绑定骨架
Skinning 引擎基于深度学习自动计算,artists 还要手动调整权重。
Animation Creation 设置关键帧和关键帧的时间间隔。
Exporting root不会跟动画一起存下,而是会单独导出来一个位移曲线来给引擎用。
FBX是保存动画的常见格式,数据包括 Model mesh
skelton
skinning data
animation clip
。