[toc]

# How to Animate a Mesh

  1. 构建一个绑定的姿势 (T-pos)
  2. 构建 Mesh 的骨骼 (骨骼动画 - 骨骼直接控制顶点)
  3. 骨骼基础上添加蒙皮动画 (在顶点中根据蒙皮的权重和骨骼来计算最终的矩阵)
  4. 先把顶点设置到初始 Pos 状态
  5. 顶点着色器中根据蒙皮和骨骼计算最终的 pos (vertex * 骨骼 TRS 矩阵)

# Joint vs Bone


joint 是关节,Bone 是两个 Joint 之间的连接,所以 Bone 可以做出 twist 的效果

# Mount Joint

比如我们想做人拿到武器的效果,就可以直接把武器 Mount 到对应的 joint 上

# Root Skeleton

实现载具系统

  1. 最终一定要绑死两个 mount point

这么说来其实原理很简单,一个是播放上马动画,上马动画在到达两个 joint 重合时就将两个 joint 绑定在一起 (放到子节点下也可以)

# 3D Rotation Math

  1. 直接三轴基的旋转矩阵相乘

# Euler Angle

划分为三个角 (计算就是上面的角度):
- Yaw
- Row
- Pitch 欧拉角运算存在的问题:
- 1. 严格依赖旋转顺序,X/Y/Z 顺序
- 2. 万向节死锁 (欧拉角会使旋转自由度退化到二维 / 一维), 比如不旋转 X, 只旋转 Y (π/2), 就会导致 Z 轴和 X 轴重合
- 3. 很难插值

# 四元数

四元数的定义 四元数乘法表

  1. i,j,k 在负数空间互相垂直
  2. 时轴垂直于空间

时轴上的距离是 a , 三虚部组成的空间是图中的空间,那么就可以定义出模 (两个空间的两点间的距离)
同时可以定义出标量乘法 定义共轭 以共轭推导逆的公式 拓展公式

# Joint Pose Interpolation

骨骼动画的顶点计算其实 106 小作业有做过

http://146.56.209.11:90/2023/05/07/【games106】-homework1/

# Weight Skinning with Multi-Joint

权重蒙皮动画
1. 算出影响的 Joint 后的顶点在局部空间的位置
2. 把所有的顶点坐标加权平均 (or 插值)

# 一个比较基础的动画运行时管线

    1. 通过 Clip 和时间找到前一帧和下一帧
    1. 两帧插值计算出当前的 Pose (Local)
    1. 计算模型坐标的 Pose 矩阵
    1. 算出蒙皮的矩阵
    1. 顶点着色器进行 TRS

# 高级动画技术

# Animation Blend

比如要算走路到跑步的动画混合
已知目标速度和当前速度: 分为跑 -> 走和走 -> 跑,简单线性插值
但是这个会出现一个问题,就是步频和实际速度应该相差不大,所以做动画时,必须保证行走和跑步的时间一致

# Blend Space (Unity 是 Blend Shape)

一维的 BlendSpace
即多动画插值 但是考虑复杂点的需求,比如人物移动实际有侧身子的需求的,这个时候就需要用到二维的 BlendSpace

  1. 将所有的动画按照 2D 的位置排布起来,给每个动画一个权重 (目前看起来权重应该是对称的)
  2. 给定权重后,对这些动画组成的图做一次三角剖分
  3. 找到每个点 (x,y) 最近的三个 clip, 做一次重心坐标插值
  4. 混合结果就是这三个动画的插值

# Blend Mask

上述是动画与动画之间的融合,那么如果我们想要实现
- 上半身鼓掌
- 下半身行走 这个时候就需要用到 Blend Mask 了,即所有动画在对应骨骼点的权重
之前一直在讲的 全局权重 ,而 BlendMask 需要考虑的则是 骨骼点权重

# Additive Blending

重点:
- 1. 我们只存储动画的变化量,而不是绝对量


# Animation State Machine

= = 就是 State Machine 比如 Jump, 一般拆成三个动画,
- 起跳 - 空中 Loop - 下降 (快落地时再播放)

如果两个动作差距太大,最好直接 fronzen transition, 而不是 smooth transition


# IK

前面讲的都是从根节点出发到叶子节点的动画系统,IK 是有约束的反向动力学,从叶子节点到根节点的影响

# Two bone IK

2BoneIK 有一个问题,即他的解是一个圆环的,就会导致如下的问题 解法:给一个 ReferenceVector, 即腿在前行时的前向向量,连接相邻的两个骨骼点,可以得到一个平面,这个平面就是目标解

# 复杂 IK

腿部的 IK 实际上只需要求解三个骨骼点即可,但是如果要求复杂的长链 IK 就无法用这么简单的解析解来做了
另外,生物的骨骼是存在可以运动的范围的