如何在圆形边界内弹回一个对象?

时间:2017-06-01 16:03:02

标签: java math libgdx

在我的游戏中我有圆形界限并且在界限内我有一个应该反弹的物体,但由于某种原因它不反弹。我的代码如下所示。

public void checkBouncer(Bouncer b){
    float x = b.getPosition().x;
    float y = b.getPosition().y;
    float cx = Constants.CENTER_X - b.getWidth() / 2;
    float cy = Constants.CENTER_Y - b.getHeight() / 2;
    float dx = Math.abs(x - cx);
    float dy = Math.abs(y - cy);
    float r = (Constants.PARAMETER_RADIUS - 45) - b.getHeight();

    // check collision between bounds and bouncer
    if ((dx * dx) + (dy * dy) >= (r * r)) {
        // original velocity vector
        Vector2 v1 = new Vector2(b.getVelocity().x, b.getVelocity().y);

        // normal vector
        Vector2 n = new Vector2(
                Constants.CENTER_X - b.getPosition().x,
                Constants.CENTER_Y - b.getPosition().y
        );

        // normalize
        if (n.len() > 0) n = n.nor();

        // dot product
        float dot = v1.x * n.x + v1.y * n.y;

        // reflected vector values
        v2.x = v1.x - 2 * dot * n.x;
        v2.y = v1.y - 2 * dot * n.y;
    }
    // set new velocity
    b.setVelocity(v2);
}

我想反弹的物体是从它朝向的方向移动开始的,更新方法如下所示:

public void update(float delta) {
    direction.x = (float) Math.cos(Math.toRadians(angle));
    direction.y = (float) Math.sin(Math.toRadians(angle));

    if (direction.len() > 0) {
        direction = direction.nor();
    }

    velocity.x = direction.x * speed;
    velocity.y = direction.y * speed;

    position.x += velocity.x * delta;
    position.y += velocity.y * delta;

    circle.set(position.x + width / 2, position.y + height / 2, width / 2);
}

但是,如果我在碰撞时反转它的工作角度,但它的抖动并不总是在碰撞时反弹。代码就在这里:

if ((dx * dx) + (dy * dy) >= (r * r)) {
        b.setAngle(-b.getAngle());
}

我需要帮助。

1 个答案:

答案 0 :(得分:0)

嗯......你在反思后得到了正确的速度矢量分量:

 v2.x = v1.x - 2 * dot * n.x; 
 and same for y

为什么需要使用角度?

如果出于某种原因确实需要方向角,请将其值设为

angle = atan2(v2.y, v2.x)