Программирование гравитации снаряда вокруг неподвижных тел

Я хочу сымитировать гравитацию в этом видео:

Демонстрация игрового процесса Bombardier Gravity

Тела неподвижны и не влияют друг на друга. Снаряды вылетают с заданной скоростью и углом. Они приближаются к планете, замедляются, затем делают резкие повороты и ускоряются.

Когда я реализовал гравитацию с помощью уравнения Ньютона, объекты всегда двигались более шатко — ускоряясь и отбрасываясь до смехотворно быстро. Возможно, дело в настройке массы.

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


person quantumpotato    schedule 07.04.2015    source источник
comment
При работе с радиальной гравитацией полезно убедиться, что у вас есть либо хорошее обнаружение столкновений, либо функция max(); на силе, создаваемой гравитацией, чтобы убедиться, что два объекта не проходят напрямую друг через друга, и получить за это значительное ускорение скорости. Кроме того, чем меньше ваш шаг физики, тем лучше.   -  person new Objekt    schedule 07.04.2015
comment
чем меньше ваш шаг по физике, тем лучше - Неправда. Уменьшение временного шага увеличивает количество времени, которое требуется для интеграции, и никто не хочет, чтобы их симуляции сканировались. Кроме того, есть области движения, где движение медленное, и в этом случае можно использовать больший временной шаг. Более того, слишком сильное уменьшение временного шага может приблизить вас к точности с плавающей запятой вашего оборудования, и в этом случае ваши ответы сильно страдают от ошибок округления и становятся полностью фиктивными. Лучшим подходом является автоматический выбор временного шага на основе текущей скорости.   -  person wltrup    schedule 18.04.2015


Ответы (2)


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

Допустим, у вас есть один снаряд массой m и несколько планет с массами Mk, расположенных в фиксированных положениях векторов Rk< /эм>. Если вектор положения снаряда равен r, то уравнения Ньютона дают вам

введите здесь описание изображения

для ускорения снаряда d^2r/dt^2 и

введите здесь описание изображения

для скорости снаряда dr/dt, где E — полная энергия (которая является постоянной движение).

Теперь представьте на мгновение, что у вас есть только одна планета с массой M и что у вас есть снаряд, вращающийся вокруг нее по эллиптической орбите с большой полуосью a и периодом Т. Тогда третий закон Кеплера говорит вам, что

введите здесь описание изображения

Конечно, у вас нет ни одной планеты, и снаряд не вращается вокруг этих планет по одной эллиптической орбите. На самом деле его орбита может даже не быть замкнутой. Тем не менее, вместо того, чтобы настраивать массы планет, подумайте о настройке масштабов времени и масштабов длины, за которые они отвечают в движении снаряда. Эти масштабы времени и длины приблизительно задаются приведенным выше выражением, по крайней мере, в тех случаях, когда орбиты почти эллиптические. Поэтому вместо Mk используйте

введите здесь описание изображения

как прокси для масс планеты. Уравнения, которые вы хотите интегрировать, становятся

введите здесь описание изображения

для ускорения снаряда d^2r/dt^2 и

введите здесь описание изображения

для скорости снаряда dr/dt.

Теперь, почему они лучше, чем исходные уравнения? Потому что вы можете заранее выбрать различные периоды и большие полуоси, которые затем определяют различные масштабы времени и длины орбиты снаряда. Это, в свою очередь, поможет вам решить, какие шаги интегрирования использовать в различных точках орбиты, и это поможет вам получить как более точную орбиту, так и более эффективную численную задачу для решения.

Например, скажем, у вас есть 3 планеты. Вместо того, чтобы произвольно устанавливать их массы и надеяться на лучшее, скажем, вы выбираете a1 = 100 пикселей, T1 = 5 секунд, a2 = 200 пикселей , T2 = 10 секунд, a3 = 150 пикселей и T3 = 30 секунд. Эти числа означают, что первый снаряд пролетит примерно 2pi x 100 пикселей за 5 секунд, то есть его скорость составляет примерно 120 пикселей в секунду< /эм>. Остальные движутся со скоростью примерно 120 пикселей в секунду и 30 пикселей в секунду. При 120 пикселях в секунду, если вы хотите интегрировать один пиксель за временной шаг, вам понадобится примерно 100 временных шагов в секунду, поэтому ваш временной шаг никогда не должен быть большим. больше 0,01 секунды.

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

Для реальной помощи в реализации адаптивных методов интегрирования для систем обыкновенных дифференциальных уравнений (примером которых является эта задача), посмотрите адаптивные методы Рунге-Кутты.

person wltrup    schedule 17.04.2015
comment
Мне нужно немного времени, чтобы прочитать и понять это. Спасибо за публикацию! - person quantumpotato; 18.04.2015
comment
Добро пожаловать. Я отредактировал свой ответ, чтобы улучшить отображение уравнений, чтобы их было легче читать, а также немного разъяснил текст в нескольких местах. Я надеюсь, что это полезно для вас (и других). - person wltrup; 19.04.2015

Очень простой, физически неправильный, но эффективный подход (используемый даже при моделировании многих тел на GPU) состоит в том, чтобы «вырезать сингулярности», гарантируя, что знаменатель в вашем -GmM/r^2 никогда не станет равным нулю. Это можно сделать, просто добавив положительную константу в знаменатель:

 |F| = G*m*M/(r^2 + c)

Это позволяет «планетам» выглядеть не как бесконечно плотные точки массы, а как расплывчатые облака материи. Это устраняет проблему со снарядами, которые резко разгоняются до экстремальных скоростей. Игроки-люди все равно никогда не заметят никакой разницы.

person Andrey Tyukin    schedule 19.04.2015