球与矩形碰撞时如何改变角度?

时间:2018-07-11 20:38:30

标签: javascript math collision-detection trigonometry angle

如果圆碰到矩形并需要反弹,我需要计算其新方向。

这就是我所拥有的

    function tick() {
        var dx = Math.cos(ball.direction * (Math.PI / 180))*ball_md.speed;
        var dy = Math.sin(ball.direction * (Math.PI / 180))*ball_md.speed;
        ball.x += dx;
        ball.y -= dy;
        drawGame(); // refresh board

        //console.log(ball);

        paddles.some(function(paddle) {
            var circle={x:ball.x+ball_md.radius, y:ball.y+ball_md.radius, r:ball_md.radius};
            var rect={x:paddle.x, y:paddle.y, w:game_md.paddle.width, h:game_md.paddle.height};
            var hit = RectCircleColliding(circle, rect);

            if (hit) {
                if (Math.floor(ball.y) + ball_md.radius*2 <= paddle.y || Math.ceil(ball.y) >= paddle.y + game_md.paddle.height) { // hit on top or below paddle
                    ball.direction = 360 - ball.direction; 
                } else { // hit left or right side
                    ball.direction = 180 - ball.direction;  
                }
                return true;
            }
        });

        if (ball.y < 0 || ball.y+ball_md.radius*2 >= game_md.height) { // hit top or bottom wall
            ball.direction = 360 - ball.direction; 
        }
        if (ball.x < 0 || ball.x+ball_md.radius*2 >= game_md.width) { // hit left or right wall
            ball.direction = 180 - ball.direction;   
        }
    }

但是它似乎并不总是有效。有人知道为什么吗?

失败时的情况。在这种情况下,它在桨表面上的弯曲非常快​​。

enter image description here

演示:https://jsfiddle.net/3ok2farw/2/

1 个答案:

答案 0 :(得分:1)

您需要单独处理拐角碰撞。当它撞到角落时,球的速度不会垂直于水平轴或垂直轴而改变,而是沿着连接球的中心和角落的线改变。我正在添加一张图纸,以使其更加清晰。如果碰撞是完全弹性的(无能量损失),则v_normal组件将替换为其负数-v_normal。如果碰撞是完全塑性的(最大能量损失),则出口速度仅为v_tangential。希望这会有所帮助!

corner collision diagram