静态和动态圆之间的碰撞响应

时间:2013-11-21 17:55:57

标签: java 2d collision-detection physics

这是在JavaFX中开发的。

有2个球 - 动态球和固定球。第一个球(动态)从墙上反弹,任何阻挡它的方式。

第二球的目的是成为第一球的障碍。因此,每当第一个球接触到第二个球时,第一个球应该立即反弹。目前,弹跳的准确性非常差,我不确切知道如何修复它。有时候第一个球会正常弹跳,但通常它会在第二个球上 INSIDE ,在那里卡住一会儿,然后反弹。下面的图片说明了这个问题。 enter image description here

这是我检测碰撞并响应它的代码:

   //Pythagorean Theorem, to detect collision, by estimating the distance between the two circles
                double dx = circle.getLayoutX() - circle2.getLayoutX();
                double dy = circle.getLayoutY() - circle2.getLayoutY();
                double radii = circle.getRadius() + circle2.getRadius();

                double distance = (dx * dx) + (dy * dy);
                double minDistance = radii * radii;


// I believe something is missing in the lines below, which is causing the problem.

                if (distance < minDistance) { //If circle1(dynamic) collides with circle2(stationary)

                    c1SpeedX = c1SpeedX * -1; //Inverts direction.

                }

我在Google上花了几个小时,但我找不到答案。我希望有人能提供解决方案并解释问题。非常感谢大家!

2 个答案:

答案 0 :(得分:1)

这可能是因为当球的方向反复颠倒时,球并不总是有时间退出更大的球。

如果距离== minDistance:

就像你现在一样。

如果距离< minDistance才会:

球在较大的球内。然后它应该已经反弹并且有点远。球应该已经从更大的球移动了sqrt(距离 - 最小距离)。

答案 1 :(得分:0)

嗯......

我认为你有一些公式错误。

例如,distanceminDistance应为

double distance = Math.sqrt((dx * dx) + (dy * dy));
double minDistance = radii;