首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理多个同时发生的弹性碰撞?

如何处理多个同时发生的弹性碰撞?
EN

Stack Overflow用户
提问于 2013-05-07 23:55:28
回答 3查看 3.1K关注 0票数 7

我使用the basic equations on wikipedia通过碰撞成对的2D凸起对象(没有旋转)来计算结果。但是,当存在依赖关系时,例如两个对象同时命中另一个对象:

例如在这里,对象1和对象2精确地同时命中3,成对方法就失败了。根据我计算碰撞的顺序(1-3优先或2-3优先),我会得到不同的结果。通过碰撞的重复迭代仍将给出依赖于顺序的结果。

我已经设置了它,这样我就可以计算出哪些对象相互接触,所以当计算这些对中的一个时,我的代码将知道对象3正在与另一个对象碰撞(因此1-3碰撞将知道2-3碰撞,反之亦然)。我也会知道哪些边/角与什么接触。

任何需要健壮的解决方案...例如,如果设置变得更复杂,如以下两个示例:

该过程需要能够处理这种情况,甚至更糟。任何可能的同时接触/冲突链。我手头有描述它们的所有数据,所以我“只”需要知道如何解决这些系统的一般情况。我目前没有做任何关于旋转的事情,它简化了事情。

它似乎涉及到将对象分组在一起,但不正交的边造成的干扰(参见最后一个六边形的例子)似乎会使该方法失败。

我看到了之前被问到的a similar question,但给出的答案从未被检查过(死胡同?)。我也不确定冲击传播将如何解决我的第一个例子,因为C在第一次碰撞后会离开……那么,有什么冲击可以传播呢?编辑:好的,我现在明白了同时碰撞和冲击传播是两个不同的概念,这就是为什么它看起来没有用的原因。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-08 01:31:35

这种dynamic simulation of multi-contact physics产生了linear complementarity problem。有一些算法可用于解决this kind of problem;数学与用于线性规划问题的算法相关。

解决这类问题的需求比你想象的要普遍得多。任何一种模糊逼真的模拟(即重力、地面和非弹性碰撞)很快就会导致物体相互碰撞;准确而稳健地处理从空间中的动态碰撞到滑动和滚动物体,再到“块堆叠”配置的过渡,在技术上可能是具有挑战性的。

我建议在这个主题上寻找books or other resources。您实际需要哪些技术将取决于您的特定应用程序,但您也许能够找到一些可以提供帮助的库。

票数 4
EN

Stack Overflow用户

发布于 2013-05-08 00:36:11

根据我计算碰撞的顺序(1-3优先或2-3优先),我会得到不同的结果。

这是正确的。这是由于碰撞的物理原理所致。考虑这个简单的例子,使用你的第一个图:

代码语言:javascript
复制
m_1 = m_2 = m_3
u_1 = u_2
u_3 = 0
x_1 = x_2 + d

1和2之间的唯一区别是1比d更接近3。1先撞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跟踪。

冲突的顺序很重要,将同时发生的冲突视为两个连续的瞬时冲突将根据处理冲突的顺序给出相互冲突的结果。

真正同时发生的碰撞通常是一种病理情况(数学上),对于游戏,甚至对于许多科学模型,可能不需要正确解决。

如果正确地解决多个弹性碰撞确实很重要,那么可以计算出它的数学公式,但您需要添加额外的假设。两个物体的弹性碰撞是由动量守恒给出的:

代码语言:javascript
复制
m_1 u_1 + m_2 u_2 = m_1 v_1 + m_2 v_2

和能量守恒:

代码语言:javascript
复制
(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

给定物体的初始速度,可以找到碰撞后两个物体的速度。如果你想修改这些方程式来考虑第三个物体,

代码语言:javascript
复制
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的动量传递应该与它们的质量成比例:

代码语言:javascript
复制
m_1^2 (v_1 - u_1) = m_2^2 (v_2 - u_2)

这对于图1中描述的情况来说是很好的:直观地说,我希望1和2具有相同的最终速度,这个约束将为您提供相同的最终速度。需要注意的是,这个等式没有明确的物理基础,在其他情况下可能会产生奇怪的结果。尝试一下,看看什么看起来是对的。

你在维基百科上提到的方程式(标准的,非常有用的教科书方程式)假设在两个物体之间有一个瞬间的动量转移。现实生活中的任何事情都不是这样的。当一个台球击中另一个台球时,球的变形非常轻微,这种变形需要时间;这种时间是毫秒或更短的,通常可以忽略不计。

票数 1
EN

Stack Overflow用户

发布于 2013-05-08 06:33:44

逐个执行各个碰撞,但始终使用每个对象的初始速度。完成后,将每个对象的速度变化相加。

代码语言:javascript
复制
(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

这样,它将不会是顺序敏感的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16423466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档