【问题标题】:Collision Response between a static and dynamic circle静态和动态圆之间的碰撞响应
【发布时间】:2013-11-22 02:38:16
【问题描述】:

这是用 JavaFX 开发的。

有 2 个球 - 一个动态球和一个静止球。第一个球(动态)从墙壁和任何挡道的物体上反弹。

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

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

   //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.

                }

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

【问题讨论】:

  • 逻辑上你不想要distant &lt;= minDistance吗?我还没有查看所有细节,但这让我觉得很奇怪。具有讽刺意味的是,有人提出了类似的问题:stackoverflow.com/questions/4613345/…

标签: java 2d collision-detection physics


【解决方案1】:

这可能是因为当它的方向一次又一次地反转时,球并不总是有时间离开更大的球。

如果距离 == minDistance:

照你现在做的。

如果距离

球在较大的球内。然后它应该已经反弹并且有点远。球应该已经将 sqrt(distance-minDistance) 移离较大的球。

【讨论】:

    【解决方案2】:

    嗯……

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

    例如,distanceminDistance 应该是

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

    【讨论】:

    • sqrt 操作比乘法更昂贵,这就是为什么我有半径 * 半径,而不是 sqrt。
    • 我认为,你应该先确保你的代码可以正常工作,然后你可以优化代码。
    • 难道c1SpeedX 应该是c1SpeedX = c1SpeedX*-1 而不是c1SpeedX = c1SpeedX-1?因为评论说:'反转方向'。
    • 该死,这正是我在我的代码中拥有它的方式,我复制了一个旧版本。我会在主帖中修复它。遗憾的是,这不是问题所在。
    • 太糟糕了。需要更多信息才能找到错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多