主要讲了欧拉积分、碰撞检测方法、碰撞结算方法 物理世界的对象:
- Static
- Dynamic
- Trigger(参与GamePlay但是与物理世界无关)
- Kinematic(动力学Actor)

Actor Shapes


欧拉积分
黎曼积分定义为:
$$ \int_a^b f(t) \, dt = \lim_{n\to\infty} \sum_{i=0}^{n-1} f(t_i^*) \, \Delta t $$其中:
- 区间 $[a,b]$ 被划分为很多小区间;
- 每个小区间长度为 $\Delta t = \frac{b-a}{n}$;
- $f(t_i^*)$ 是函数在区间上的一个采样值;
- 积分就是“采样 × 宽度”的极限
显式欧拉法 = 左端点采样(Left Riemann Sum) 隐式欧拉法 = 右端点采样(Right Riemann Sum)
显式欧拉积分
用当前状态的参数来近似 $\Delta T$ ,比如$t_0时速度为5,那就假设$$\Delta T$内都是5来模拟积分。 显式欧拉法 = 用左端点采样的黎曼积分近似。

这样求积分的问题是:力不守恒,用因为时间段内力不是恒定的。 如下图所示,如果总是以某一点的力的方向来求解,那物体总是朝着切线方向位移,来不及改变力的方向(因为在$\Delta T$时间内力是恒定的)


隐式欧拉方法
用未来的状态来计算$\Delta T$时间内的数据 。隐式欧拉法 = 用右侧端点采样的黎曼积分近似。

显然能量衰减了,我在$\Delta T$时间内又不是一直这么小

半隐式欧拉法
有点像Hack…..

这种方法数学上很稳定 $\Delta T$取0.05就能很好模拟圆周运动了


刚体运动学
这块课程很杂,应该需要用到什么学什么,这里先听课

碰撞检测
一般分两步:
- AABB检测
- 计算碰撞点

Broad Phase
BVH检测

排序检测

Narrow Phase
用球的半径来检测


闵可夫斯基和(Minkowski Sum)
两个点集内全部互相加

红色三角形表示Minkowski Sum的结果


再定义减法

最妙的来了,如果红色图像包了原点,那就碰撞了

如何判断这个多边形过原点呢?

分离轴原理(SAT)


碰撞处理
处理碰撞后分离

Hack

约束求解
需要再看


Scene Query
查询碰撞点、查询Sweep、查询Overlap
raycast查询碰撞点:比如子弹

Sweep

Overlap:比如爆炸范围overlap了那些Actor

优化
模拟优化

CCD:连续碰撞检测,离散检测可能会穿过薄面

确定性模拟:不同的机器计算结果应该一致,比如显卡、移动端等差别
