Как я могу учесть импульс в моем космическом симе?


8

Я сейчас пытаюсь создать простой движок 2-й физики и сталкиваюсь с некоторыми проблемами, выясняя, как включить импульс в движение космического корабля.

Если я двигаюсь в заданном направлении с определенной скоростью, я могу в настоящее время легко обновить положение своего корабля (Положение + = Направление * Скорость). Однако, если корабль вообще вращается, и я пересчитываю направление (на основании нового угла, на который направлен корабль) и ускоряюсь в этом направлении, как я могу учесть импульс, чтобы изменить «линию», по которой движется корабль? В настоящее время корабль мгновенно меняет направление и продолжает двигаться со своей текущей скоростью в этом новом направлении, когда я нажимаю кнопку тяги. Я хочу, чтобы это было более плавное вращение, чтобы создать впечатление, что сам корабль имеет некоторую массу.

Если на эту тему уже есть хороший пост, я прошу прощения, но в моих поисках ничего не появилось. Дайте мне знать, если потребуется дополнительная информация, но я надеюсь, что кто-то может легко сказать мне, как я могу добавить массовую скорость в свое обновление игрового цикла.


Если вы хотите больше узнать о том, как программировать движение, вы можете взглянуть на бесплатную игру Transcendence, еще один космический шутер, который использует это. Может быть, вы можете посмотреть на его сценарии или спросить разработчиков, как они это сделали
Mastersteviekun

Ответы:


7

Похоже, у вас есть Положение и Направление как векторы и Скорость как скаляр?

Если это так, просто измените Velocity на вектор, а затем сделайте что-то вроде этого:

Force = Direction * Power
Acceleration = Force / Mass
Velocity += Acceleration * ElapsedTime
Position += Velocity * ElapsedTime

Направление - это вектор длины единицы, определяющий направление движения вашего корабля. Сила - это сила тяги, которую вы хотите добавить (ноль, когда ускорение не требуется). ElapsedTime - это время между вашими играми. Обновление звонков для обеспечения плавного движения даже при изменении частоты кадров.

Если вы хотите узнать больше об этом, вы можете посмотреть Euler Integration


1
Да, и следующим шагом вверх является моделирование закона Ньютона F = m * a. Таким образом, вместо использования константы «Power» для получения ускорения вы используете «Acceleration = Force / mass». Поэтому, когда вы применяете тягу, вы применяете это как вектор силы. Это позволит вам легко применить другие силы к вашему космическому кораблю, сложив вместе все векторы силы и рассчитав соответствующее ускорение. Также означает, что вы можете играть с Mass как отдельной переменной.
TerryB

Терри прав, я забыл включить это в свой оригинальный пост.
Мистер Белл

Спасибо мистер Белл / Терри. Оба уравнения, перечисленные выше, помогли мне программно сделать это. У меня было много проблем с пониманием, как это будет работать, пытаясь использовать поплавки повсюду. После переключения всего, кроме массы, на векторы (благодаря вышеперечисленному leftium) я смог наконец заставить все работать.
Джош Петит

8

Вместо непосредственного управления скоростью , добавьте еще одну переменную: ускорение , которое постепенно плавно изменяет скорость :

Из классической физики ( законы движения Ньютона ):

a =  F/m  // a Force will result in a smaller acceleration on objects with more mass
v += a    // acceleration is the rate of change in velocity
p += v    // velocity is the rate of change in position    

где:

a = acceleration, v = velocity, p = position
F = force, m = mass

(Примечание m - единственное скалярное значение; F, a, v и p - все 2D или 3D векторы)

Кроме того, на самом деле есть два направления:

  1. Направление движения корабля. Сила от двигателей прикладывается вдоль этого вектора.
  2. Направление движения корабля (из-за импульса). Это вектор скорости v.

Я ответил на соответствующий вопрос на StackOverflow: 2D Spaceship движения математике . В этом ответе есть пример кода.


Обратите внимание, что при моделировании на основе тиков этот метод даст неверные результаты. Базовые формулы верны в непрерывном мире физики, но вам нужно выполнить численное интегрирование, чтобы получить точные результаты. Подробнее здесь: gafferongames.com/game-physics/integration-basics
Тетрадь

Наконец-то все заработало. Большое спасибо всем. Потребовалось некоторое время, чтобы понять, как правильно анализировать это входное событие вместе с моим обновлением (а также с учетом использования времени).
Джош Петит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.