首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决圆-圆碰撞

问解决圆-圆碰撞
EN

Stack Overflow用户
提问于 2013-08-24 04:02:15
回答 4查看 3.9K关注 0票数 6

我正在编写扩展Circle-Rectangle collision detection (intersection)以包含对冲突的响应的软件。圆形边和圆形矩形是相当简单的。但是circle-circle把我难倒了。

例如,在离散事件模拟中,假设两个圆发生碰撞,一个是红色的,一个是绿色的。我们可能会遇到以下情况:

​

​

在它们相撞后,我们可以立即得到:

​

​

这里,RIP和GIP是前一个时钟节拍时圆圈的位置。在当前时钟节拍,在RDP和GDP处检测到冲突。然而,当两个圆在RCP和GCP时,时钟节拍之间发生冲突。在时钟滴答处,红色圆圈向下移动RVy,向右移动RVx;绿色圆圈向下移动GVy,向左移动GVx。RVy不等于GVy;RVx也不等于GVx。

​

​

当圆心之间的距离小于或等于圆的半径之和时,即上图中的d <= ( Rr + Gr ),就会发生碰撞。在d<( Rr + Gr )的碰撞中,我们需要在调整圆的速度分量之前将DPs定位回CPs。在d == ( Rr + Gr )的情况下,由于DP在CP处,因此不需要重新定位。

这就是问题所在:我如何才能回到CPs。一些作者建议应用下图中p所给出的渗透率的一半。

​

​

对我来说,这是完全错误的。它假设两个圆的速度矢量相等,但在本例中并非如此。我认为穿透力与计算有关,但我无法理解。我知道这个问题可以被重塑为一个直角相似三角形的问题,在这个问题中,我们想要为Gcdy和GCdx解决。

​

​

碰撞本身将被建模为弹性的,并且惯性交换的数学已经就位。唯一的问题是在碰撞时将圆放置在哪里。

EN

回答 4

Stack Overflow用户

发布于 2013-08-24 21:34:06

“这就是问题所在:我该如何采取行动。”

您可能想知道如何“在调整圆的速度分量之前将DPs重新定位到CPs”。

因此有两个问题,如何确定CPs (碰撞发生的位置)以及如何从该点调整圆的运动。第一部分有一个相当简单的解决方案(允许不同的半径和速度分量),但第二部分取决于是否对弹性或非弹性响应进行建模。在你写的评论中:

碰撞将被建模为弹性。惯性交换的数学已经就位了。问题是在哪里放置圆圈。

假设我将只解决第一个问题,解决碰撞发生的确切位置。假设两个圆的匀速运动,知道碰撞发生的确切时间就足够了,也就是说,什么时候两个圆的中心之间的距离等于它们的半径之和。

在匀速运动下,一个圆圈(红色)的速度减去另一个圆圈(绿色)的速度,就可以认为它是静止不动的。实际上,我们将第一个圆的中心视为固定的,并且只认为第二个圆处于(匀速)运动中。

现在,通过求解一个二次方程就可以找到碰撞的确切时间。设V= (GVx-RVx,GVy-RVy)为圆的相对运动,P= (GIPx-RIPx,GIPy-RIPy)圆在碰撞前的瞬间的相对位置。我们通过定义以下内容来“动画”相对位置P的线性路径:

P(t) =P+ t*V

并询问这条直线何时与半径Rr+Gr原点周围的圆相交,或者何时相交:

(Px + t*Vx)^2 + (Py + t*Vy)^2 = (Rr + Gr)^2

这是一个未知时间t的二次方程,涉及到的所有其他量都是已知的。在这种情况下(碰撞发生在位置CP或之前)将存在一个正实解(通常有两个解,一个在CP之前,一个在CP之后,但可能是一个掠过接触,给出一个“双根”)。你想要的解决方案(根)t是较早的那个,其中t(在“瞬间”RIP,GIP位置为零)较小。

票数 4
EN

Stack Overflow用户

发布于 2013-08-24 17:01:37

如果你正在寻找圆形物体非弹性碰撞的基本参考资料,Joe van den Heuvel和Miles Jackson的Pool Hall Lessons: Fast, Accurate Collision Detection Between Circles or Spheres是非常容易理解的。

从最不正式到最正式,这里有一些关于实现编程工艺的后续参考,这些编程支撑了您的问题的解决方案(碰撞响应)。

The Physics in Games - Real-Time Simulation Explained

的幻灯片

你必须接受一些近似值- Beckman在视频中演示了,即使对于非常简单的情况,也不可能通过分析预测会发生什么,这更糟糕,因为你正在模拟一个具有离散步骤的连续系统。

票数 2
EN

Stack Overflow用户

发布于 2016-11-15 05:43:54

要以恒定的速度重新定位两个重叠的圆,您只需找到碰撞发生的时间,并将它们的速度因子添加到它们的位置。

首先,我们考虑的不是两个圆的运动,而是一个圆的半径以及相对位置和速度的组合。假设输入圆的位置为P1和P2,速度为V1和V2,半径为r1和r2。让组合的圆具有位置半径、速度半径和半径r = r1 + r2。

​

​

我们必须找出圆穿过原点的时间,换句话说,找出哪个r = |P + tV|的t的值。应该有0、1或2值,具体取决于圆是不通过原点、与原点相切还是与原点相切。

通过使两边平方来实现r^2 = ||P + tV||。

r^2 = (P + tV)*(P + tV) = t^2 V*V + 2tP*V + P*P利用L2范数等同于向量自身的点积这一事实,然后分布点积。

t^2 V*V + 2tP*V + P*P - r^2 = 0把它变成了一个二次方程。

如果没有解决方案,则判别式b^2 - 4ac将为负。如果它是零或正的,那么我们对第一个解决方案感兴趣,所以我们将减去判别式。

代码语言:javascript
复制
a = V*V
b = 2 P*V
c = P*P - r^2
t = (-b - sqrt(b^2 - 4ac)) / (2a)

所以t是碰撞的时间。

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

https://stackoverflow.com/questions/18410937

复制
相关文章

相似问题

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