Как применить 2D гравитационные эффекты к спрайтам - PullRequest
0 голосов
/ 21 марта 2019

В двумерном бесконечном пространстве у меня есть два круговых спрайта, которые представляют массивные тела в космическом пространстве.

Каждое тело имеет пару x, y координат, a mass, a speed и direction (в радианах).

В каждом кадре анимации я запускаю следующий код для каждого тела (где this - это обновляемое тело, а other - этодругое тело):

x, y = other.x - this.x, other.y - this.y

angle = atan2(y, x)
distance = root(square(x) + square(y))
force = this.mass * other.mass / square(distance)

Примечание: я игнорирую G , поскольку это просто множитель.

Я знаю, как перемещать тела, основываясь наих координаты, скорость и направление, но не знаю, как обновить this.speed и this.direction для имитации гравитации.

1 Ответ

1 голос
/ 21 марта 2019

Гравитационная сила, действующая на данное тело, представлена ​​в виде вектора и вызывает ускорение с компонентами (ax и ay), которые рассчитываются (исходя из того, что у вас уже есть) следующим образом:

squared_distance = square(x) + square(y)
distance = sqrt(squared_distance)

accel = other.mass / squared_distance    
ax = accel * x / distance 
ay = accel * y / distance

Обратите внимание, что angle (направление силы / ускорения) не требуется.

Каждое тело должно иметь соответствующую скорость (вместо speed), которая должна быть двухкомпонентным вектором (vx и vy). Он обновляется следующим образом (где dt - интервал времени между обновлениями):

this.vx += ax * dt
this.vy += ay * dt

Как только скорость данного тела была обновлена, ее можно затем изменить (обновив ее x, y координаты) следующим образом:

this.x += this.vx * dt
this.y += this.vy * dt

Вы можете рассчитать скорость и направление, если они вам нужны, но они здесь не нужны.

...