GAME104第十节

物理对象与形状

物理对象

  • Static Actor:静态的物体,比如一些墙壁、地形等。
  • Dynamic Actor:动态的物体,比如一些机关挡板等,一般不会设置很多,动态的结算需要时间
  • Trigger
  • Kinematic Actor

对象形状

  • Spheres 球

  • Capsules 胶囊

  • Boxes

  • Convex Meshes:凸包,封闭环境的一个物体。

  • Triangle Meshes

    image-20241111143820644

    动态对象不能用triangle mesh,只能处理静态的东西。

  • Height Fields:高层图,地形方面用。

对象属性

Mass 质量、Desnsity 密度、Center of Mass 质心、物理材质(定义弹性、摩檫力)

物理中,我们假设物体的质量均匀。

物理引擎中,计算稍微一点误差,效果就会差很大。

力与运动

image-20241111145709151

Drag 拉力、Gravity 重力、Friction 摩檫力、Impulse 冲力

运动

  • 显示欧拉法:预测未来的位移。精度问题会导致能量不守恒。
  • 隐式欧拉法:稳定解。
  • 半隐式欧拉法:游戏引擎中使用。

eg:表达圆周运动。

大部分的物理过程是无法得到一个解析解,因此需要用分部的方法去模拟,这是一个积分的过程。这中间有稳定的、不稳定的解。

刚体运动学

物体不但会运动,还会有一个自旋。

旋转一般对刚体有价值,柔体(比如橡皮糖)做起来就非常的困难。

image-20241111152733015

  • Orientation:表达旋转的姿态,3*3的旋转矩阵或者四元数。
  • Angular velocity 角速度:旋转轴
  • Angular acceleration 角加速度
  • Inertia tensor 转动动量
  • Angular momentum 角动量:角动量守恒
  • Torque 力矩

刚体动力学和普通力学的对应关系:

image-20241111154029613

碰撞检测

一般物理引擎会分为两个阶段。

image-20241111171857177

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 分离轴定理:

    如果两个物体没有碰撞, 那么一定可以找到一个轴,两个物体在轴垂直方向上的投影完全分开

碰撞解决

刚体物体不能重合,两个物体碰撞后,需要把两个物体“分开”:

image-20241111164606256

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 确定性仿真

确定/一致的方法:

  • 不同终端中步长是一致的(帧率一样)
  • 迭代时的顺序是一样的。
  • 浮点数一致性。

每次对世界的模拟,不同的小区别都会导致一个大的不同。