物理步要进行的工作
物理/碰撞步通常执行的操作:
-
Ⅰ.以Δt对施于物理世界刚体的力和力矩计算前向积分,求出次帧的暂定位置定向。
-
Ⅱ.调用碰撞检测程序库,判断暂定移动是否有令物体间产生新的接触点。
刚体通常会记录其接触点,从而利用时间相关性。因此在模拟的每部中,碰撞引擎只需判断是否有失去之前的接触点,以及是否加入了新的接触点。
- Ⅲ.进行碰撞决议。
常用的方法是使用冲量、惩罚性力、或作为以下约束求解的一部分。
- Ⅳ.以约束求解程序满足约束条件。
第四步完成时,有些刚体可能已移离第一步所计算的暂定位置。这种移动可能会导致物体间有其他穿插的情况,或者可能破坏了其他之前已满足的约束。因此需要迭代重复执行第一步到第四步,直至成功决议所有碰撞并且满足所有约束,或者超过预设的迭代数目。
超过预设迭代数目后,求解程序在本次物理步放弃求解,期望在之后的模拟帧能自然解决。这样也能在多个帧里分摊碰撞及约束决议的成本,避免产生尖峰。但是如果错误太大、时步太长或不稳定,这种做法可能导致不正确的行为。
可以在模拟中混合惩罚性力,以使模拟能随时间逐渐解决这些问题。
约束求解程序:
约束求解程序(constraint solver)本质上是一个迭代算法,尝试最小化刚体在物理空间的实际位置定向与约束所定义的理想位置定向的误差,以同时满足大量的约束,因此约束求解程序本质上是迭代式误差最小化算法。
刚体运动脱离约束时,约束求解程序会趋向令它们回复至合乎约束。幸运的话通过在求解程序中使用谨慎设计的错误最小化方式,这种反馈循环最终应该可以求得合法解。
约束求解程序的解不是一定精确的,可能会出现不可能的行为。约束求解程序的目的是最小化误差而不是完全消除误差。
各引擎的差异:
不同的物理SDK中计算方法步骤可能会有一些差异。
有些约束类型是用力和力矩建模的,这些约束不是由约束求解程序处理,而是由数值积分器处理。
碰撞可以在数值积分之前运行而非之后。碰撞也可以用不同方法解决。
(END)