2D刚体动力学模拟器Dyna-Kinematics,具有很多可以生成炫酷动画的开源库。话不多说,先给出1个仿真案例
该动力学模拟器主要包含以下三部分,即(1)数值积分器(2)2D刚体动力学(3)2D平面碰撞检测。
仿真控制器允许用户:从一组硬编码的场景中选择一个场景;播放,暂停,重置和将模拟记录为GIF;更改某些模拟和显示设置。
具体的应用场景包括:
1 Body-wall collisions
开发过程的第一步是实现对物体与墙壁之间碰撞的支持。 这种碰撞比物体之间的碰撞简单得多,因为墙壁不会受到碰撞的任何影响。 在代码中,墙被视为具有无限质量的物体,这大大简化了碰撞响应方程。在下面的模拟中,注意物体的速度和角速度如何根据其撞击墙壁的方式而变化。 这就是刚体动力学的特征。
2 Body-body collisions
开发过程的第二步是实现对物体之间碰撞的支持。 这种类型的碰撞可能以两种不同的方式发生:两个顶点之间或顶点与边之间。解决碰撞的重要部分是了解碰撞法线是什么。 在顶点-边缘碰撞中,碰撞法线只是边缘的法线。 但是顶点-顶点碰撞呢? 顶点只是点,因此它们没有法线。 有许多方法可以为此类碰撞计算适当的法线。
3 Momentum and torque
橙色物体的质量比黄色物体的质量大得多,因此它的动量也更大。 因此,橙色的物体几乎不受碰撞的影响,而黄色的物体反转了方向。粉红色主体的重心位于两端之间。 两个物体之间的接触点位于其上端,或者说,尽可能远离其质心,这意味着通过碰撞施加给它的扭矩最大。 该扭矩转化为最大可能的角速度,从而使其绕其质心快速旋转。
4 gravity
当我们检测到碰撞时,参与该碰撞的两个刚体几乎是接触的,因为它们在碰撞阈值之内,这是一个很小的距离。在此模拟器中,刚体是完全刚硬的,这意味着它们是不可穿透的。那么,如何防止它们渗透?我们无法施加力量并随着时间的推移对其进行整合,因为我们实际上没有足够的时间来这样做。这两个机构几乎是接触的,因此,如果我们采用这种方法,它们肯定会渗透。这就是为什么我们需要不连续地改变它们的速度,这只能通过在无限的时间段内施加强大的力(即脉冲力)来实现。
因此,既然您知道我一直以来都在用脉冲力来欺骗您,那么您可能想知道该模拟器是否可以随时间实际整合力。它使用经典的四阶Runge-Kutta方法来整合所需的任何力。下面的模拟显示了重力的作用:
在碰撞发生时不会损失任何能量,因此身体不会停留在山底。 我使用恢复系数(COR)进行此操作,该模型模拟了碰撞过程中消散了多少传入能量。 通过将COR设置为1,我使所有碰撞都具有完美的弹性,这意味着发生碰撞时不会损失任何能量。 如果我将COR设置为0,则在第一次碰撞中所有传入的能量都将丢失,这完全是塑性碰撞。 0到1之间的任何值都会改变所损失的能量。
这就是弹性碰撞和塑性碰撞。
5 Simultaneous collisions
开发过程中的最后也是最具挑战性的步骤是实现在单个时间步中解决多个冲突的支持。要了解“在单个时间步中解决多个冲突”的含义,让我们首先逐步看一下到目前为止我向您展示的模拟是如何执行的:
通过提前一个时间步来开始仿真。 例如,如果时间步长为20毫秒,并且物体的速度为10米/秒且没有加速度,则该物体向前移动0.2米。检查场景中是否有任何物体正在穿透另一个物体或墙壁。 如果是,则我们返回与上一步相同的时间,将时间步长减半,然后再次进行仿真。 使用前面的示例,这意味着我们的时间步长将变为10毫秒,并且我们的身体只会向前移动0.1米。重复之前的步骤,直到没有渗透发生为止。 您可以将此过程视为二进制搜索,以查找可以推进没有场景发生的场景的时间量。
每个实体均表示为定向边界框(OBB)。不支持OBB与墙形成的拐角之间的碰撞。 因此,墙壁必须形成凸形,以确保永远不会发生无支撑的碰撞。OBB之间的冲突分为两类:顶点-顶点冲突和顶点-边缘冲突。 对于顶点-顶点碰撞,将碰撞体的质心连接起来的线用作碰撞法线。通过解决简单的几何问题可以检测到碰撞。 没有像分离轴定理那样复杂的东西被使用。 仅将顶点投影到法线或边缘上即可查看它们是否穿透,并计算它们的相对速度以查看它们是否碰撞。
使用经典的四阶Runge-Kutta方法执行积分。时间步是固定的。如果将时间步长设置为20毫秒,则每次渲染一帧时,仿真都会提前20毫秒,而与渲染每帧所花费的时间无关。人们通常对此不屑一顾,因为它会产生问题:如果您的计算机能够快速渲染,则模拟将在其上快速显示,但如果它仅能够缓慢地渲染,则在其上将呈现缓慢的仿真。尽管如此,我仍然决定保持时间步长固定,因为这可以使用户使用“记住帧”功能获得漂亮的效果。如果允许帧中执行的步骤数根据渲染该帧所花费的时间而有所变化,那么“记住帧”功能将不会产生完美间隔的结果。身体不允许进入。这是我在开发过程的早期做出的一个决定,因为如果两个物体已经穿透,我将找不到有关如何解决碰撞的信息。在此模拟器的代码中,当两个物体穿透时,时间步被细分,直到它们没有穿透为止。该技术的问题在于,在某些情况下,可以无限细分时间步长,并且仍然无法使物体停止穿透。为了防止仿真器在这种情况下进入无限循环,我执行了一条简单的规则:如果将时间步长细分为小于1微秒,则会停止仿真并显示“无法解决的穿透”错误。
个人评价:该软件为一个小软件,针对平面物体的动力学仿真较为详细,对于认知平面动力学以及图形学具有较重要的启发作用。