具有奇数误差的二维圆形碰撞

时间:2014-05-27 23:29:24

标签: java 2d geometry game-physics

我是一个视觉学习者,正在研究一个简单的2D游戏,它需要球在没有旋转的情况下互相反弹。

我在许多链接中都遵循了代码,并选择使用Ball to Ball Collision - Detection and Handling

中的示例 然而,我的代码导致球加速失控并且还以某种方式在击球时从比赛场地移除球。如果有人可以向我描述我的错误,这将是很多相关的。但是,我会在逐步描述上面链接中发现的碰撞背后的数学图片中找到同样多的帮助。

public void resolveCollision2(PoolBall ball) {

    vector delta = new vector(getXPos() - ball.getXPos(), getYPos() - ball.getYPos());
    float d = (float) delta.getMagnitude();
    vector mtd = delta.scalerMultiply((32.0 - d) / d);
    vector reset = mtd.scalerMultiply(0.5);

    XPos = XPos + reset.getXlen();
    YPos = YPos + reset.getYlen();

    ball.setXPos(ball.getXPos() - reset.getXlen());
    ball.setYPos(ball.getYPos() - reset.getYlen());

    vector v1 = new vector(getXVel(), getYVel());
    vector v2 = new vector(ball.getXVel(), ball.getYVel());

    vector v = v1.subtract(v2);
    float vn = v.dot(mtd.normalize());

    if(vn > 0.0f) return;

    float i = (-(1.0f + 0.1f) * vn);
    vector impulse = mtd.scalerMultiply(i);

    vector v1prime = v1.add(impulse);
    vector v2prime = v2.subtract(impulse);

    setXVel(Math.sqrt(v1prime.getXlen()));
    setYVel(Math.sqrt(v1prime.getYlen()));


    ball.setXVel(Math.sqrt(v2prime.getXlen()));
    ball.setYVel(Math.sqrt(v2prime.getYlen()));

}


public void poolBallPoolBallCollision() {

    double XDif = 0.0;
    double YDif = 0.0;
    double XDif2 = 0.0;
    double YDif2 = 0.0;

    for (int i = 0; i < 15; i++) {  
        for (int j = i + 1; j < 15; j++) {  
            if (colliding(ballList[i], ballList[j])) {
                ballList[i].resolveCollision2(ballList[j]);
            }
        }
    }
}

注意事项

  • 球具有相同的质量
  • 没有摩擦
  • 没有旋转

0 个答案:

没有答案