计算圆的速度

时间:2018-04-28 21:42:01

标签: javascript html canvas physics

我一直在努力解决这个问题,而且看起来并不太难,但是我累了,我尝试的越来越复杂(但它和#39;可能很容易)。

我的目标是让球从另一个球上弹开。似乎很容易。

球2由用户的鼠标控制(到目前为止它有点像单人乒乓球,但它是一个圆而不是一个矩形)所以它的速度不是物质

球1有一些属性,包括dx(每帧移动的x距离)和dy(dx,但对于y坐标)

到目前为止,我所遇到的问题是,你不知道哪些值是正的,哪些是负的(因此速度可能会立即严重增加或减少),你可能能够解决这个问题。还有很多其他的,但我现在太困惑了。

这是此功能的重要部分。此外,我试图设置它,以便dx + dy始终相同,即使数字发生变化,也会让它看起来更自然。

if (collision(ball, paddle)) {
    diffX = paddle.x-ball.x;
    diffY = paddle.y-ball.y;
    totalVel = ball.dx+ball.dy;
    dir = {
      x : diffX/(diffX+diffY)*-totalVel,
      y : diffY/(diffX+diffY)*-totalVel
    };
    ball.dx = dir.x;
    ball.dy = dir.y;
  }

这是一个包含完整代码的JSFiddle https://jsfiddle.net/a2prr0uw/1/

2 个答案:

答案 0 :(得分:2)

首先让我们首先定义“弹跳”是什么 - 速度是相同的,但方向(在两个轴上)将被反转。如果我们像对待一样对待dx和dy,那么我们可以先得到球的传入速度:

var ballSpeed = Math.sqrt((ball.dx * ball.dx) + (ball.dy * ball.dy));

无论dx和dy在做什么,上述值都将是正值。

接下来,我们需要传球的方向 - 这个位与你现在的相同:

diffX = paddle.x-ball.x;
diffY = paddle.y-ball.y;

然而,如果我们将其视为矢量,它实际上具有完全未知的长度。所以,让我们将它标准化,使它成为长度为1的方向向量:

var distanceBetweenPaddleAndBall = Math.sqrt((diffX * diffX) + (diffY * diffY));
diffX /= distanceBetweenPaddleAndBall;
diffY /= distanceBetweenPaddleAndBall;

diffX和diffY现在是一个标准化的方向向量 - 球当前进入的方向 - 而ballSpeed是我们想要的速度。

所以现在我们将应用弹跳 - 翻转方向并保持速度。这就是:

dir = {
  x : -diffX * ballSpeed,
  y : -diffY * ballSpeed
};

把它们放在一起,我们最终得到这个:

if (collision(ball, paddle)) {
    diffX = paddle.x-ball.x;
    diffY = paddle.y-ball.y;
    // How fast is the ball coming in?
    var ballSpeed = Math.sqrt((ball.dx * ball.dx) + (ball.dy * ball.dy));
    // How far is the ball from the paddle?
    var distanceBetweenPaddleAndBall = Math.sqrt((diffX * diffX) + (diffY * diffY));

    // Normalise diffX and diffY so we have a direction vector:
    diffX /= distanceBetweenPaddleAndBall;
    diffY /= distanceBetweenPaddleAndBall;

    // Apply the bounce and the original ball speed:
    dir = {
      x : -diffX * ballSpeed,
      y : -diffY * ballSpeed
    };
    ball.dx = dir.x;
    ball.dy = dir.y;
  }

here it is as a fork of your fiddle too

答案 1 :(得分:0)

不是答案,而是对你的弹跳逻辑的一些考虑:

  • 你必须计算球方向(dy / dx)
  • 碰撞也有一个方向(两个中心之间的角度= b.x-p.x / b.y-p.y)
  • 弹跳后的角度必须根据这两个角度计算:使用第二个进行镜像
  • 计算新的dx&碰撞后你需要原始速度Math.abs(Math.sqrt(Math.pow(dx)+ Math.pow(dy)))球
  • 基于此速度和新方向,您可以计算新的dx& DY