我是通过使用the basic equations on wikipedia碰撞成对的2D凸面对象(没有旋转)来计算结果的。但是,当存在依赖关系时,例如两个对象同时命中另一个对象:
例如,在这里,对象1和2在完全相同的时间点击3,成对方法失败。根据我计算碰撞的顺序(先是1-3或先2-3),我会得到不同的结果。通过碰撞重复迭代仍然会产生依赖于顺序的结果。
我已经设置好了所以我可以弄清楚哪些对象彼此接触,所以我的代码会知道在计算其中一对时,对象3在那一刻与另一个对象发生碰撞(所以1-3碰撞将知道2-3碰撞,反之亦然)。我也知道边缘/角落与什么接触。
无论什么解决方案都需要健壮......例如,如果设置变得更复杂,就像这两个例子一样:
这个过程需要能够处理这个问题,甚至更糟。任何可能的同时接触/碰撞链。我将手头上的所有数据描述它们,所以我“只”需要知道如何解决这些系统的一般情况。我目前没有对旋转做任何事情,这简化了事情。
似乎将涉及将对象分组在一起,但是由非正交的边缘引起的干扰(参见最后一个带有六边形的示例)似乎会使该方法失败。
我之前看过a similar question,但是从未检查过答案(死胡同?)。我不确定冲击传播会如何解决我的第一个例子,因为C在第一次碰撞后就会移开......所以有什么震撼可以传播?编辑:好的,我现在看到同时碰撞和震动传播是两个不同的想法,这就是它看起来没用的原因。
答案 0 :(得分:4)
这种dynamic simulation of multi-contact physics会产生linear complementarity problem。有一些算法可以解决this kind of problem;数学与用于线性规划问题的数学有关。
解决此类问题的需求比您想象的更为常见。任何类型的模糊逼真的模拟(即,具有重力,地面和非弹性碰撞)将很快结束彼此放置的物体;准确而稳健地处理从空间动态碰撞到滑动和滚动物体到“块堆叠”配置的过渡,在技术上具有挑战性。
我建议在这个问题上寻找books or other resources。您实际需要哪种技术取决于您的具体应用,但您可能会找到一些有用的库。
答案 1 :(得分:1)
根据我计算碰撞的顺序(先是1-3或先2-3),我会得到不同的结果。
这是正确的。这是由于碰撞的物理学如何起作用。考虑这个简单的例子,使用你的第一个数字:
m_1 = m_2 = m_3
u_1 = u_2
u_3 = 0
x_1 = x_2 + d
1和2之间的唯一区别是1比d更接近3。首先命中3,停止,并且v_3变为u_1(u是初始值,v是最终速度)。因为u_2和新的v_3是相同的,所以对象2和3将以恒定的速度向右移动,它们之间具有恒定的距离d;他们永远不会碰。如果交换1和2,即,如果x_2 = x_1 + d,那么2次命中3并停止,1次跟踪3次后d。
碰撞的顺序很重要,并且像两次连续瞬时碰撞一样处理同时碰撞会产生相互矛盾的结果,具体取决于碰撞的处理顺序。
真正同时发生的碰撞通常是病态的(数学上),并且可能没有必要为游戏正确解决,甚至对于许多科学模型都没有。
如果正确解决多个弹性碰撞确实很重要,那么可以计算出相应的数学计算,但是您需要添加其他假设。两个物体的弹性碰撞由动量守恒给出:
m_1 u_1 + m_2 u_2 = m_1 v_1 + m_2 v_2
和节约能源:
(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2
考虑到物体的初始速度,可以找到碰撞后两个物体的速度。如果你想修改这些方程以考虑第三个对象,
m_1 u_1 + m_2 u_2 + m_3 u_3 = m_1 v_1 + m_2 v_2 + m_3 v_3
(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 + (1/2) * m_3 u_3^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 + (1/2) * m_3 u_3^2
必须引入第三个独立的等式。一个简单的约束可能是物体1和2的动量传递应该与它们的质量成正比:
m_1^2 (v_1 - u_1) = m_2^2 (v_2 - u_2)
对于图1中描述的情况,这将是很好的:直觉上,我希望1和2具有相同的最终速度,并且这种约束会给你这个。请注意,此等式没有明确的物理基础,可能会在其他情况下给出奇怪的结果。试验并看看看起来是对的。
您在维基百科上提到的等式(标准的,非常有用的教科书方程式)假设两个物体之间存在动量的瞬时转移。对于现实生活中的任何事情来说,这都不是真的。当一个台球击中另一个时,球变形很小,这种变形需要时间;这个时间是毫秒或更短的时间,通常可以忽略不计。
答案 2 :(得分:0)
逐个进行单个碰撞,但始终使用每个对象的初始速度。完成后,将每个对象的速度变化相加。
(v1_1,v3_1) = collide(u1,u3,m1,m3)
(v2_2,v3_2) = collide(u2,u3,m2,m3)
v1 = u1 + (v1_1 - u1) = v1_1
v2 = u2 + (v2_2 - u2) = u2_2
v3 = u3 + (v3_1 - u3) + (v3_2 - u3) = v3_1 + v3_2 - u3
这样,它不会对订单敏感。