物理对象与形状
物理对象
- Static Actor:静态的物体,比如一些墙壁、地形等。
- Dynamic Actor:动态的物体,比如一些机关挡板等,一般不会设置很多,动态的结算需要时间
- Trigger
- Kinematic Actor
对象形状
Spheres 球
Capsules 胶囊
Boxes
Convex Meshes:凸包,封闭环境的一个物体。
Triangle Meshes

动态对象不能用triangle mesh,只能处理静态的东西。
Height Fields:高层图,地形方面用。
对象属性
Mass 质量、Desnsity 密度、Center of Mass 质心、物理材质(定义弹性、摩檫力)
物理中,我们假设物体的质量均匀。
物理引擎中,计算稍微一点误差,效果就会差很大。
力与运动
力

Drag 拉力、Gravity 重力、Friction 摩檫力、Impulse 冲力
运动
- 显示欧拉法:预测未来的位移。精度问题会导致能量不守恒。
- 隐式欧拉法:稳定解。
- 半隐式欧拉法:游戏引擎中使用。
eg:表达圆周运动。
大部分的物理过程是无法得到一个解析解,因此需要用分部的方法去模拟,这是一个积分的过程。这中间有稳定的、不稳定的解。
刚体运动学
物体不但会运动,还会有一个自旋。
旋转一般对刚体有价值,柔体(比如橡皮糖)做起来就非常的困难。

- Orientation:表达旋转的姿态,3*3的旋转矩阵或者四元数。
- Angular velocity 角速度:旋转轴
- Angular acceleration 角加速度
- Inertia tensor 转动动量
- Angular momentum 角动量:角动量守恒
- Torque 力矩
刚体动力学和普通力学的对应关系:

碰撞检测
一般物理引擎会分为两个阶段。

Broad phase 初筛
用AABB(AABB轴向对齐包围盒 简化了物体的碰撞形状 用于快速判断是否能碰撞)快速的把物体之间是否有可能碰撞给计算出来。
- BVH:BVH树。环境在发生变化时,更新效率高。
- Sort and Sweep:先把物体排序好,在物体动的时候对局部的进行一些移动。
Narrow phase 精细
若有个可能碰撞,则精细的检测是否碰撞、碰撞点和深度是怎么样。
Basic Shape Intersection Test 基本形状相交测验
Minkowski Difference-based Methods:把两个凸包是否球交的问题,转换成一个多边形是否过圆心的问题。
GJK算法:
知道多边形所有点去判断是否过圆心还是困难。
GJK是快速用趋势最快的方向去逼近圆点,直到靠不动为止,判断出是否过圆心。Separating Axis Theorem SAT 分离轴定理:
如果两个物体没有碰撞, 那么一定可以找到一个轴,两个物体在轴垂直方向上的投影完全分开
碰撞解决
刚体物体不能重合,两个物体碰撞后,需要把两个物体“分开”:

Applying Penalty Force:早期使用的方法,会出现物体炸开的现象。
Non-linear Gauss-Seidel Method 高斯赛德尔方法:不断叠加。目前物理引擎使用的方法。
场景查询
Raycast 射线检测
- Mutiple hits:返回射线经过的所有物体
- Closest hit:返回最近的物体
- Any hit:返回是否被物体挡住
Sweep 横扫
角色移动是,就是胶囊体Sweep
Overlap
给你一个形状,问这个在物理世界中有没有碰撞。
手雷爆炸,周围的人是否被炸到。
Collision Group 刚体分组:
- Player :Pawn
- Obstacle :Static
- Movable box : Dynamic
- Trigger box : Trigger
效率,准确性与确定性
lsland和sleeping
物理引擎中,是将物体分成了一个个的Island(类似分组)
物理的对象在世界散布,不可能每隔一定时间算一遍,这时分成一个个的lsland,如果lsland如果没有一个力的改变输入等,就让其“sleep”。
Continuous Collision Detection CCD 连续碰撞检测
当角色高速移动时,人脑袋卡进墙中:
- 角色的移动速度过快 ,在当前帧角色在位置A,下一帧位置已经直接穿过障碍物。
- 在碰撞检测时,基于两个形体的检测时, 两个物理对象(actor)是没有交集。
- 这里又叫Tunneling 隧穿效应。
最简单的解决方案就是不解了。把地面做厚一些。
目前也可以使用CCD的方法。
Deterministic Simulation 确定性仿真
确定/一致的方法:
- 不同终端中步长是一致的(帧率一样)
- 迭代时的顺序是一样的。
- 浮点数一致性。
每次对世界的模拟,不同的小区别都会导致一个大的不同。