【问题标题】:How to separate two colliding circles?如何分开两个碰撞的圆圈?
【发布时间】:2011-09-01 14:07:47
【问题描述】:

我希望将两个碰撞的圆圈分开,以最小的量将它们均等地向后推,以使它们完全分开。

到目前为止我有这个:

var totalRadius : Number = _circle1.radius + _circle2.radius;
var x : Number = _circle1.position.x - _circle2.position.x;
var y : Number = _circle1.position.y - _circle2.position.y;

var distanceSquared : Number = (x * x) + (y * y);

if (distanceSquared < totalRadius * totalRadius)
{   
    var distance : Number = Math.sqrt(distanceSquared);

    var separation : Number = totalRadius - distance;

    // No idea what to do now!

}

到目前为止,我已经弄清楚了这么多。所以我知道发生了碰撞,并且我知道每个圆圈是 separation 彼此的数量(所以我猜想除以 2 以将它们平均分开)。

问题是分离没有任何隐含的方向性,我不知道该怎么做。我不能只做circle1.position -= separation / 2; circle2.position += separation / 2,因为那样会同时移动 X 轴和 Y 轴。

如何为separation 添加方向性?

谢谢!

【问题讨论】:

标签: c# math xna collision-detection geometry


【解决方案1】:

使用单位向量将两个圆移动separation / 2

unitVector = (circle1.Position - circle2.Position) / distance

circle1.Position += unitVector * seperation / 2

circle2.Position -= unitVector * seperation / 2

编辑:

只需更改 seperation / 2 和/或 +- 部分。它可以让你随意移动它。

【讨论】:

  • 好的,这很有帮助,但现在我遇到了另一个问题:物体没有锁定到位,但速度较高的物体正在推动另一个物体。我应该编辑这个问题还是发布一个新问题,或者您认为您可以提供帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多