GAMES104-10:物理:基础理论和算法
十、物理:基础理论和算法
10.1 物理对象与形状
10.1.1 Actor
- static actor:静态物体,不移动,不用解算
- dynamic actor:动态物体,每一帧都需要计算其状态
- trigger:触发器,和物理世界没有关系
- kinematic actor:运动学物体,无视物理规则,直接由游戏逻辑控制
10.1.2 Actor Shapes
10.1.3 Shape属性
质量 Mass & 密度 Density
质心 Center of Mass
物理材质:摩擦系数 Friction、弹性系数 Restitution
10.2 力与运动
10.2.1 力的种类
Force:有一定持续时间的力,如重力、拉力、摩擦力
Impulse:冲量
10.2.2 移动
显式欧拉法:用当前的力&速度计算位移
- 优点:容易计算
- 缺点:能量不守恒
隐式欧拉法:用未来的力&速度计算位移
- 优点:能量会衰减,从而保证计算是稳定的,衰减很小时可以被视为转化为热能
- 缺点:如果力是取决于位置的,那么在位置不确定的情况下,无法知道未来的力
半隐式欧拉法:用当前的力、未来的速度计算位移
- 优点:更加稳定,并且容易计算
- 缺点:积分出来的周期会比实际的周期长一点,导致有一定的相位差
10.3 刚体动力学
10.3.1 质点动力学
10.3.2 基础概念
10.4 碰撞检测
10.4.1 两个阶段
- Broad Phase:使用AABB包围盒,快速筛除一些不会碰撞的物体
- Narrow Phase:精确判断是否能够碰撞,生成碰撞信息
10.4.2 Broad Phase
10.4.2.1 BVH树
10.4.2.2 Sort and Sweep
对于AABB包围盒来说:
- 将每个包围盒按照x轴上的两个边界排序
- 如果在轴上分离,则一定无法碰撞
- 如果在轴上交错,则可能碰撞,此时计算y轴是否交错
- 只有两个轴上都交错,才会碰撞
更新时:
- 相当于在一个已经排好序的数组中,更新某个数的位置,效率很高
10.4.3 Narrow Phase
- 准确检测碰撞
- 生成碰撞信息
- 碰撞采样:生成碰撞点的集合
- 碰撞法线
- 穿透深度
10.4.3.1 基础图形碰撞检测
10.4.3.2 Minkowski算法
10.4.3.2.1 Minkowski和
- A为一个点:相当于B加上了A的位移
- A为线段:相当于B加上A的位移后,沿A的方向和长度整体移动
- A为三角形:相当于B加上A的位移后,沿A的轮廓整体移动
- 两个凸包的闵可夫和 = 对应顶点的闵可夫和
10.4.3.2.2 Minkowski差
- 将被减数变为它的负数,转化为Minkowski和
10.4.3.2.3 Minkowski差 & 原点
- 如果两个凸包有交点,那么Minkowski差一定包含原点
10.4.3.2.4 GJK算法
- 随机选取一个方向,在该方向的两端找到沿该方向最远的两个点AB,这两个点相减一定是结果的一个顶点C
- 以OC为新的方向,再选择两个点相减,得到顶点D
- 以CD的垂线方向,选择两个点相减,得到顶点E
- 判断原点是否在三角形CDE中
- 如果在,则说明凸包包含原点
- 如果不在,则以离原点最远的那条边的垂线方向,选择两个点相减,得到顶点F,判断原点是否在三角形DEF中
- 以此类推,直到无法找到新的凸包中的顶点
10.4.3.3 分离轴定理 SAT:Separating Axis Theorem
- 空间中的任意两个不相交的凸多面体,一定能找到一根轴,使得:两个凸多面体在该轴上的投影不会有交集
- 空间中的任意两个不相交的凸多面体,以其中一个多面体的一条边为轴,能够将这两个凸多面体分离
检测算法:
- 以A的每一条边的垂线为轴,检测B的每个顶点是否在A的另一侧
- 以B的每一条边的垂线为轴,检测A的每个顶点是否在A的另一侧
- 只要有一条边满足要求,那么两者就是分离的
3D中的延申:
- 要检测A中的每一个面、B中的每一个面
- 还需要检测A中的每一条边与B中的每一条边的叉积形成的平面
对于运动中的物体:
- 上一次得到的分离轴,是下一次检测的第一个轴
10.5 碰撞解决
10.5.1 添加一个Penalty Force
10.5.2 将力学问题转化为约束问题
- 碰撞时,给物体一个小冲量,然后求解拉格朗日约束
- 如果不满足约束,则调整冲量,不断迭代,直到满足约束
10.6 场景请求
10.6.1 Ray Cast
- Mutiple hits:返回所有碰撞结果
- Closest hit:返回最近的碰撞结果
- Any hit:随机返回一个碰撞结果
10.6.2 Sweep
整个物体的横扫
10.6.3 Overlap
判断一个形体是否与其他Actor碰撞
10.6.4 碰撞分组
10.7 效率、准确性、确定性
10.7.1 Island
将整个物理世界分为不同island
如果某个island稳定下来了,那么就会进入sleeping状态
10.7.2 CCD:Continuous Collision Detection 持续碰撞检测
当物体移动过快时,可能会出现上一帧没碰撞,下一帧直接穿过的问题
- 可以将地面做厚
- 进行CCD:保守估计一个安全步长,当距离过近时,需要减小步长
10.7.3 确定性模拟
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论