首页 理论教育 实时动态仿真基础:碰撞检测与求解

实时动态仿真基础:碰撞检测与求解

时间:2023-11-21 理论教育 版权反馈
【摘要】:正如在2.3节中介绍的,碰撞检测模块遍历全局碰撞列表,检测系统中最近的单个或多个碰撞。检查碰撞是否实际上只是接触。如果小于阈值,则碰撞判定为接触,并且将被转移到辅助接触列表。仿真引擎将再次移动这些物体,并忽视在移动过程中可能发生的任何碰撞。更新与各碰撞物体相关的最终位置和方向,以体现碰撞或接触的影响。首先在仿真世界列表创建新的潜在碰撞列表;然后仿真引擎将继续检查和求解碰撞,直至当前采样时间结束。

实时动态仿真基础:碰撞检测与求解

正如在2.3节中介绍的,碰撞检测模块遍历全局碰撞列表,检测系统中最近的单个或多个碰撞。这些碰撞被传输到碰撞响应模块以便计算碰撞冲量和防止穿透需要的接触力。

此时,仿真引擎还创建了另一个辅助列表,包括实际为接触的碰撞。由于在解决接触之前应先解决碰撞,因此有必要对二者进行区分。换言之,只有在使用碰撞冲量更新系统的动力学状态之后,我们才能够计算在物体之间强制执行非穿透约束条件的接触力。

仿真引擎执行以下步骤。求解单个或多个碰撞。

(1)时间回溯(用线性插值),将所有碰撞物体移至碰撞的前一时刻。

(2)检查碰撞是否实际上只是接触。检查每次碰撞,包括测试碰撞物体在碰撞点沿着碰撞法线的相对速度是否小于阈值。如果小于阈值,则碰撞判定为接触,并且将被转移到辅助接触列表。

(3)计算每次碰撞相关的碰撞冲量。

(4)使用步骤(3)中的碰撞冲量,更新系统的动力学状态,这将更新所有碰撞物体的线速度和角速度。(www.xing528.com)

(5)检查接触(若存在)是否仍然有效。对于涉及碰撞的物体相关的每个接触进行检查,包括再次检测在接触点沿着接触法线的相对速度是否仍然不使物体分离。由于碰撞物体的动力学状态已经发生变化,涉及它们中任何物体的接触在接触点的相对速度应当也随之发生变化。在有些情况下,在施加碰撞冲量之后接触可能分离,使得处理接触变得没有必要。

(6)计算在每个接触点避免物体互相穿透所需的接触力。接触力计算涉及对系统当前接触配置中获得的线性互补问题(LCP)进行求解。

(7)将接触力(及相关扭矩)添加到施加于物体的净外力-扭矩对中。将在剩余时间内施加达到当前时间间隔末尾所需的非穿透约束条件。

在求解完所有碰撞和接触之后,仿真引擎计算达到当前采样时间结束时刻所需的剩余时间,并仅对涉及碰撞或接触的物体进行运动常微分方程的数值积分运算。仿真引擎将再次移动这些物体,并忽视在移动过程中可能发生的任何碰撞。由于净作用力和扭矩已更新,在当前剩余时间间隔内保持接触的物体将不会出现穿透。

更新与各碰撞物体相关的最终位置和方向,以体现碰撞或接触的影响。首先在仿真世界列表创建新的潜在碰撞列表;然后仿真引擎将继续检查和求解碰撞,直至当前采样时间结束。

在当前采样时间结束时,仿真引擎向渲染引擎发送自上次更新之后位置或方向发生变化的物体列表,然后继续移动物体,检查并响应碰撞,更新显示结果,直至收到渲染引擎发出的终止指令。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈