Расчет скорости круга - PullRequest
       9

Расчет скорости круга

0 голосов
/ 29 апреля 2018

Я немного поработал над этой проблемой, и она не кажется слишком сложной, но я устаю, и чем больше я стараюсь, тем труднее (но, вероятно, это действительно легко).

Моя цель - отскочить от другого мяча. Кажется, достаточно просто.

Мяч 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 голосов
/ 29 апреля 2018

не ответ, но некоторые соображения по поводу вашей прыгающей логики:

  • Вы должны рассчитать направление шаров (dy / dx)
  • столкновение также имеет направление (угол между обоими центрами = b.x-p.x / b.y-p.y)
  • Угол после отскока должен быть рассчитан на основе этих двух углов: использование второго для отражения
  • для расчета новых dx и dy после столкновения вам понадобится исходная скорость Math.abs (Math.sqrt (Math.pow (dx) + Math.pow (dy))) шара
  • на основе этой скорости и нового направления вы можете рассчитать новый dx & dy
0 голосов
/ 29 апреля 2018

Итак, во-первых, давайте начнем с определения того, что такое «отскок» - скорость одинакова, но направление (на обеих осях) будет инвертировано. Если мы будем рассматривать 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;
  }

И вот оно как вилка вашей скрипки тоже .

...