【问题标题】:Box collision detection and bouncing盒子碰撞检测和弹跳
【发布时间】:2010-12-29 00:02:17
【问题描述】:

我正在打乒乓球,并且发现很难编写一个正确地将球从四壁上弹回的算法(我稍后会处理得分,因为只有西部+东部的一部分会进球) .所以现在我想让球在禁区周围反弹。

检测球是否撞墙很容易,但我在计算新角度时遇到了麻烦。

这是我目前想出的:

        if(dstY == 0) {
            // North wall
            if(angle < 90) {
                newAngle = angle + 90;
            } else {
                newAngle = angle - 90;
            }
        } else if(dstX == maxWidth) {
            // East wall
            if(angle < 90) {
                newAngle = angle + 270;
            } else {
                newAngle = angle + 90;
            }
        } else if(dstY == maxHeight) {
            // South wall
            newAngle = angle + 90;
        } else if(dstX == 1) {
            // West wall
            if(angle < 270) {
                newAngle = angle - 90;
            } else {
                newAngle = angle - 270;
            }
        }

这只适用于大约一半的碰撞,而且看起来非常难看。我敢肯定这应该很简单,而且之前已经做过很多次了。

在我的代码中,dstX/dstY 是 X/Y 目标坐标。左上角的 X=0 和 y=0。

【问题讨论】:

  • 你能描述一下它是如何失败的吗?如果球正好击中角球会发生什么?

标签: java collision-detection bounce


【解决方案1】:

您可以通过两种方式来看待这个问题:

角度:如果您知道球碰撞的角度,只需执行 180 - 角度即可找到新角度。

渐变:可能更简单。您必须每 t 毫秒以某个 dY 和 dX 移动球。因此,如果您碰壁,您可以简单地使用 dY 和 dX 的反转符号。例如,如果你撞到了右边的墙,dX 会变成 -dX,而 dY 会继续前进。

【讨论】:

    【解决方案2】:

    在这个KineticModel 中,方法collideWalls() 使用二维矢量算法来简化粒子与平面之间的弹性碰撞的模拟。

    【讨论】:

      【解决方案3】:

      关于使用 jbx 的渐变方法的一个智慧词。如果球在盒子的角落附近击中,而 dx 将被反转,dy 可以将球置于顶部边界之上。

      【讨论】:

        【解决方案4】:

        谢谢@jbx,我知道有一种更简单的方法 :) 但是,这似乎不适用于东墙和西墙以及桨(如果它们在那些墙上)。不过,这似乎对我在东墙和西墙上有用:

        (180 - (angle + 90)) - 90.
        

        简化为(180-angle)。 希望对您有所帮助。

        【讨论】:

        • 这不是简化的方式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        相关资源
        最近更新 更多