碰撞响应
当刚体互相碰撞时,动力学模拟必须采取步骤确保它们对碰撞做出真实的响应,并确保它们永不在模拟步完成之后处于互相穿插状态。称为碰撞响应。
1.能量
施加力让刚体移动了一段距离,则称该力做了功(work)。功代表能量(Energy)的改变。
力可以给刚体系统增加能量(例如爆炸),也可以给刚体系统减少能量(例如摩擦力)。
- 线性运动的能量:
$T_{linear} = {1 \over 2}mv^2 = {1 \over 2}p·v$
- 刚体旋转的能量:
$T_{angular} = {1 \over 2}L·ω$
2.冲量碰撞响应
两个物体在真实世界碰撞机理很复杂,物体会被轻微压缩然后反弹,并在过程中因为发热发声损失一些能量。
多数实时刚体动力学模拟对这些细节进行逼近,使用到一个简单模型-无摩擦力下瞬时碰撞的牛顿恢复定律。该定律假设:
- 碰撞力作用域无穷短的时间之内,物体在碰撞时瞬时改变速度。
- 物体表面无摩擦力,即分离物体的冲量垂直于这两个表面,没有切线上的分量。
- 定义一个恢复系数ε,当恢复系数为1时为完全弹性碰撞,没有任何能量损失。当恢复系数为0时为完全塑性碰撞,碰撞之后黏在一起失去相对速度。
- 动量守恒:
$m_1 v_1 + m_2 v_2 = m_1 v_{1^′} + m_2 v_{2^′}$
- 能量守恒:
${1 \over 2}m_1 v_1^2 + {1 \over 2}m_2 v_2^2 = {1 \over 2}m_1 v_{1^′}^2 + {1 \over 2}m_2 v_{2^′}^2 + E_{lost}$
- 设冲量为Δp:
$m_1 v_{1^′} = m_1 v_1 + Δp$
$m_2 v_{2^′} = m_2 v_2 - Δp$
- 恢复系数:
$v_{2^′} - v_{1^′} = ε(v_2 - v_1)$
- 如果假设刚体不能旋转,求解Δp:
$Δp = { {(ε + 1)(v_2·n - v_1·n)} \over {(1 / m_1) + (1 / m_2)}}n$
如果考虑到刚体的旋转,上述方程会复杂一点,需要先知道接触点的速度而非质心的速度,然后要计算碰撞后真实旋转效果所需的冲量,计算方法略。
3.惩罚性力
另一个碰撞响应方法是引入惩罚性力(pealty force)的虚构力。
惩罚性力可以看作在两个刚互相穿透的刚体接触点之间加上一个坚硬的阻尼弹簧。
- 优点:
惩罚性力对于多个刚体互相穿透的情况也能良好工作。但如果刚体成对进行碰撞计算则非常难求解。
- 缺点:
惩罚性力仅仅响应物体间穿透。即相对位置,不响应相对速度,所以力的方向可能不真实。(特别是对于高速物体)
4.使用约束解决碰撞
多数物理系统能把约束施加给刚体。碰撞能使用约束求解程序解决。
5.摩擦力
摩擦力(friction)产生在两个持续接触的刚体之间,阻碍相对运动。
摩擦力分为静摩擦力(static friction)和动摩擦力(dynamic friction)。
6.焊接
当物体在多边形汤上面滑动时,从一个三角形滑倒另一个三角形时,碰撞检测系统会产生额外的伪接触点,系统会认为该物体碰到了下一个三角形的边缘。
此问题有多种解决方法。一种是分析接触集合,移除伪接触点(一种思路是通过存储前一帧的三角形表面接触信息,判断接触点是否在三角形边缘)。
另一种是加入三角形邻接信息,碰撞系统可以得知哪些是内边。Havok4.5开始使用此技术,称为焊接(welding)。
7.休止、岛屿、休眠
物体通过摩擦或者阻尼减少能量,最终必须能停下来。但是计算机模拟中的浮点数误差和计算误差会导致物体持续抖动很难休止下来。因此多数物理引擎会采用启发式方法,检测物体是否在振动,是否应该休止。
物体停止下来时,便没必要每帧对其方程进行积分。为了优化性能,多数物理引擎容许模拟中的动力学物体进入休眠(sleep)状态,排除在模拟之外。当受到外力或者失去支持点时,将物体重新唤醒继续动力学模拟。
休眠条件:
- 刚体含有三个以上接触点或者一个或以上的接触平面,在其他力的作用下处于平衡状态。
- 刚体动量和角动量低于预设阈值。
- 刚体动量和角动量的移动平均低于预设阈值。
- 刚体总动能低于预设阈值。
- 对于将休眠的刚体,可以逐渐减慢其运动使其平滑停止而不是突然停止。
模拟岛:
Havok和PhysX都会把物体分组以进一步优化性能。可以按正在互动的物体分组,或者是把近期潜在会互动的物体组成模拟岛(simulation island)。每个模拟岛独立于其他岛进行模拟,非常有利于缓存一致性和并行处理。
Havok和PhysX都会以整个岛为单位进行休眠而非独立刚体。优点是性能提升更多,缺点是一个物体苏醒整个岛都必须苏醒。但是优点足以抵消其缺点。
(END)