物体从地面落下

时间:2014-05-23 11:31:51

标签: java collision-detection physics

我使用LWJGL在Java中编写2D Ball-SideScroller。

我目前的问题是,我有某种非确定性行为。如果我在我的应用程序中按下' -Button - 主要类的构造函数(" World")被调用,但球的位置几乎每次都在变化。

这里有一个ScreenShot将解释情况:

http://img5.picload.org/image/lcopowc/landingpoint_0.png

左上角:这是球击中地面的地方 - 当然它应该向下滚动

右上角:那就是这里发生的事情 - 相当不错,尽管球和地之间有2或3个像素

左下:第三个更糟糕 - 80%的球在地上

右下:最后但并非最不重要 - 最糟糕的......这里的球只是忽略了它落在的斜坡上

我尝试了以下方法来解决这个问题:

  • 将渲染从立即更改为VBO

  • 添加了一个一直更新坐标的线程(每隔ms)

  • 检查了FPS-Rate,其恒定为60

这里有一些来自方法的代码" ballReachedGround"虽然我不确定问题是否确实存在于该方法中

private boolean ballReachedGround(double slope) {
    if (velocityX > 0) {
        return checkFallRight(slope);
    } else if (velocityX < 0) {
        return checkFallLeft(slope);
    }
    return false;
}

private boolean checkFallRight(double slope) {
    if (ball.getY() + ball.getTransy() + ball.getRadius() >= realY2) {
        double xdiff = (ball.getX() + ball.getTransx() + ball.getRadius()) % 50;
        double actualHeight = realY1 + (xdiff / 50) * (realY2 - realY1);
        if (slope < Math.tan(Math.toRadians(-45))) {
            if (ball.getY() + ball.getTransy() + ball.getRadius() >= actualHeight) {
                if (ball.getY() + ball.getTransy() >= actualHeight) {
                    velocityX = 0;
                    return true;
                }
            }
            System.out.println(slope);
        } else {
            double angle = Math.toDegrees((Math.atan(slope)));
            double anglediff = ball.getRotate() - angle;
            ball.setTransy(ball.getTransy() - velocityX * timediff
                    * Math.tan(Math.toRadians(anglediff)));
            if (ball.getY() + ball.getTransy() + 40 >= actualHeight) {
                return true;
            }
            System.out.println(slope);
        }
    }
    return false;
}

1 个答案:

答案 0 :(得分:0)

视频很清楚。所以你的物理错了。一旦发现碰撞,您应该尽可能以最短的方式将身体移出静止场景(=地面)。这就是物理引擎的工作原理。因此,换句话说,你的抛物线轨迹似乎很好,但由于这是一个模拟,它会产生步骤,所以它不是一条连续的路径。它将在地面上方的一个框架,而在下一个框架中,它将在地面上。一旦你发现了这一点,将球移回最近的方向。在边缘,如果你在墙壁上反弹,这可能会向左或向右移动。