avatar

Ycyofmine’s Blog

云鸮雨霁

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
首页 GAMES104 08.游戏引擎的动画技术基础(下)
文章

GAMES104 08.游戏引擎的动画技术基础(下)

发表于 2024/11/05
作者 Ycyofmine
7 分钟阅读

蒙皮动画的实现:关节与蒙皮

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

  1. 三数表示单位四元数: 对于单位四元数 $q = (a, b, c, \sqrt{1 - (a^2 + b^2 + c^2)})$,只需要三个数来表示它。第四个分量 $d$ 可以由其他三个分量通过单位模约束计算得出。

  2. 范围限制: 通过始终省略绝对值最大的分量,剩下的三个分量的范围可以限制在 $\left[ -\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}} \right]$ 之间。

  3. 分量范围的推导:
    • 由于 $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$。
  4. 实际运用

    46 45 用来存储四元数中哪个是最大值

    44-30、29-15、14-0分别存另外三个数

Error Propagation

压缩之后会掉精,error 就会在关节之间传递,传递次数越多,error 就会变得非常恐怖。

Measuring Accuracy

定义两个垂直于关节的点,与 offset 进行比较,来量化 error 的程度。

Error Compensation

没听太懂,讲的好像是修正 error 时会产生的错误效果。

动画制作流程

  1. Mesh Building 在关节处,Mesh的精度会更高一些。

  2. Skeleton Binding 利用引擎快速绑定骨架

  3. Skinning 引擎基于深度学习自动计算,artists 还要手动调整权重。

  4. Animation Creation 设置关键帧和关键帧的时间间隔。

  5. Exporting root不会跟动画一起存下,而是会单独导出来一个位移曲线来给引擎用。

FBX是保存动画的常见格式,数据包括 Model mesh skelton skinning data animation clip 。

GAMES104
games104
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • ROS2中并发连接蓝牙手柄排错过程
  • 自行编译ros2-humble-plotjuggler
  • Ubuntu 22.04上蓝牙无法打开——(MT7922网卡为例)
  • Isaac sim遥操作控制
  • RPC:原理、组成与局限性
外部链接
  • codetime
  •  此博客的 Github 仓库

文章内容

相关文章

2024/11/12

GAMES104 09.高级动画技术:动画树、IK和表情动画

动画混合 Math of Blending: LERP Calculate Blend Weight Align Blend Timeline 把两个循环动画时间归一化,要求动画师对齐两组动画中的关键点。 如果align或者插值没做好,容易出现滑步。 混合空间 1D Blend Space 混合方向,但是没有混合运动速度。 2D Blend S...

2024/11/01

GAMES104 08.游戏引擎的动画技术基础(上)

靠,被专周硬控一周,不过好在大概知道C++项目整个流程是什么样的了,也算是有所收获。 2D游戏动画技术 Sprite animation 多张图片顺序播放。 Live 2D 将图片拆分成多个图源,在图源上打上控制点,通过移动控制点来达到图片变换的效果。 3D游戏动画技术 DoF(Degrees of Freedom) 六方向自由度代表可以按 xyz 进行平移或旋转。 Rigid Hi...

2024/10/21

GAMES104 07.游戏中渲染管线、后处理和其他的一切

Ambient Occulsion 在每个可看见的点处,它的可看见的正半球面,只有部分可以染上环境光,另一部分则被其他物体遮挡,主要体现在阴影的真实程度上。 Precomputer AO 提前烘培出的一张AO纹理 仅适用于静态对象 Screen Space Ambient Occlusion(SSAO) 从screen打出一条射线,击中一个点p,在那个点生成一个球,...

GAMES104 08.游戏引擎的动画技术基础(上)

笔记本外接显卡选购至组装全记录

© 2025 Ycyofmine. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

games104 UE c++ robot OS 装机 计网 essay

发现新版本的内容。