分开两个碰撞的圆圈

时间:2011-09-01 06:35:17

标签: c# math xna collision-detection

我正试图将两个碰撞的圆圈分开。感谢别人的帮助,我就在那儿!

这是我的代码:

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;

    var unitVectorX : Number = (_circle1.position.x - _circle2.position.x) / distance;
    var unitVectorY : Number = (_circle1.position.y - _circle2.position.y) / distance;

    _circle1.position.x += unitVectorX * (separation / 2);
    _circle1.position.y += unitVectorY * (separation / 2);

    _circle2.position.x -= unitVectorX * (separation / 2);
    _circle2.position.y -= unitVectorY * (separation / 2);
}

如果圆圈的速度相同,则效果很好。当它们具有不同的速度时会出现问题,而问题是因为我将分离均匀分开(separation / 2)我认为!

如果circle1的速度为1,0而circle2的速度为-1,0,则一切都能正常工作。两个圆圈相互撞击并停止。

如果circle1的速度为2.0且circle2的速度为-1,0,则圆圈逐渐向右移动。我想这就是发生的事情:

帧1:

  • circle1(99,100)
  • circle2(101,100)

式2:

  • circle1(101,100)
  • circle2(100,100)
  • 检测到碰撞,校正位置分别为-0.5和+0.5。
  • circle1(100.5,100)
  • circle2(100.5,100)

帧3:

  • circle1(102.5,100)
  • circle2(99.5,100)
  • 检测到碰撞,校正位置分别为-1.5和+1.5。
  • circle1(101,100)
  • circle2(101,100)

窗口4:

  • circle1(103,100)
  • circle2(100,100)
  • 检测到碰撞,校正位置分别为-1.5和+1.5。
  • circle1(101.5,100)
  • circle2(101.5,100)

正如你所看到的,由于速度的不同,两个圆圈的右边都增加了+0.5。

最后,我的问题是:我怎样才能将它们的速度分解到等式中,这样才不会影响它们的分离?

谢谢!

2 个答案:

答案 0 :(得分:0)

简短回答:你必须在那里得到momentum;)

正如我猜你想要 mass 一样,它归结为“v1_before ^ 2 + v2_before ^ 2 = v1_after ^ 2 + v2_after ^ 2”。正如维基文章所说,我只是“切换”速度。

我不明白为什么你认为圈子会向右移动?这种推测不是弹性碰撞吗?如果你想要它们具有相同的质量,它们应该朝不同的方向前进。

答案 1 :(得分:0)

你需要计算影响点,而不是仅仅(任意)向后移动它们。

快速搜索找到了这些链接:

  1. http://www.t3hprogrammer.com/research/circle-circle-collision-tutorial#TOC-Static-Circle-Circle-Collision-Dete(“动态圆圈碰撞”一节)

  2. http://nonlinear.openspark.com/tutorials/vectors/index.htm(“影响,而不是交集”一节)