Я пишу 2D физический движок в javascript, чтобы я мог больше узнать о физике в видеоиграх. Он работает правильно для столкновений с твердым телом, за исключением случаев, когда любое тело сталкивается с двумя или более другими телами одновременно.
В настоящее время для каждой пары сталкивающихся тел (A, B) я изменяю их скорости и угловые скорости, основываясь на импульсе столкновения, и выталкиваю их друг от друга, чтобы они не проникали. Но тогда обнаружение столкновений и расчеты импульсов для других столкновений с участием A будут неправильными.
Какие подходы я могу исследовать, чтобы заставить мой двигатель работать на 3+ объектах, сталкивающихся друг с другом?
2d
collision-detection
javascript
physics
кулачок
источник
источник
Ответы:
Я использую следующий подход (похожий на алгоритм массового расщепления Тонге http://www.richardtonge.com/ ):
m_A/M
а массу B наm_B/N
m_A = m_A * M
иm_B = m_B * N
)Этот подход аналогичен тому, как итерационный алгоритм Якоби работает с линейными одновременными системами уравнений. И не гарантируется сходство, но в моем симуляторе это делает работу довольно плавно ... в 3D (да, дополнительное измерение увеличивает вдвое сложность!).
Предостережение : исправляйте положения и скорости только после завершения фазы обнаружения / обработки столкновений! Таким образом вы одновременно обновляете своих сталкивающихся актеров. Кроме того, силы восстановления должны быть приняты во внимание в следующий раз, когда вы интегрируете позиции и скорости.
РЕДАКТИРОВАТЬ: Ну, я думаю, что вы используете уже используемый метод интеграции Verlet (этот стал нарицательным среди энтузиастов Gamedev). В этом спектре обработки столкновений и интеграции вы можете посмотреть здесь .
ОБНОВЛЕНИЕ: Некоторая информация о том, как приблизиться к столкновению (и собственно столкновению в этом отношении), может быть найдена в этих статьях:
Несколько простая статья о разрешении столкновения твердого тела с помощью импульсных методов: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Нерастяжимые упругие стержни с торсионным трением на основе множителя Лагранжа
Предложенный мною подход далеко не является оригинальным вкладом, многие игры используют его с правдоподобными результатами, и его лучше всего использовал Якобсен в своем игровом движке Hitman.
Исходя из некоторого практического опыта, штрафные силы (аналогичные линейным или экспоненциальным пружинам, получающим свои входные данные от расстояния проникновения) не могут должным образом разрешить проникновения, когда другие силы от сталкивающихся тел могут быть больше, чем они. Вот почему я решил объединить три (почти избыточных) подхода: ньютоновские силы реакции (вы толкаете стену, стена отодвигается назад), полученные из импульса скорости (столкновение шаров для снукера) и неестественное «геометрически отодвигают тела друг от друга» " решение. Вместе они, кажется, обеспечивают все: избавиться от большинстваУжасные артефакты взаимопроникновения, сталкивающиеся тела имеют тенденцию взаимодействовать друг с другом в долгосрочной перспективе (из-за скоростей и сил восстановления - по крайней мере, силы, которые имели тенденцию тянуть тела в сценарии столкновения, устраняются, и тела отскакивают друг от друга) , Наконец, для дальнейшего понимания этих простых, но общих концепций, я предлагаю проанализировать эти слайды .
Мой эпитет «метод злоупотребления», описывающий шаги интеграции Verlet, нацелен на убеждение популярной культуры, что это Святой Грааль методов интеграции. Это просто немного лучше, чем его кузен Симплектический Эйлер (также называемый некоторым неявным Эйлером). Существуют более сложные методы интеграции (и все они имеют неявное имя в них). Их используют мощные игровые движки, но у независимых разработчиков нет времени экспериментировать с ними, поскольку Verlet, настроенный на конкретный сценарий, действительно творит чудеса. Кроме того, нет абсолютно никакого метода интеграции, который мог бы справиться с жесткими ограничениями без небольшого обмана (не могу найти ссылку, но документ, на который я ссылаюсь, должен называться «X.Provot -» Деформационные ограничения в массе модель для описания поведения жесткой ткани "
источник
Я полагаю, что вместо изменения скоростей вы изменяете силы, действующие на объект. Не «подталкивайте» их, скорее делайте это плавно и используя уже существующий код. Делая это, тела не будут немедленно (и, я полагаю, быстро) изменять свои скорости.
Проверьте Box2DJS для примера: http://box2d-js.sourceforge.net/index2.html .
источник
Я аналитически решил импульсное уравнение для групп сталкивающихся тел. Единственной проблемой, с которой я столкнулся, было отсутствие переменных для определения относительной силы взаимодействия между контактами в группе, которую я заполнил глубиной пересечения тел.
Решение для групповых контактов не намного сложнее, чем одиночный контакт. К сожалению, я потерял статью с расчетами, поэтому не смог поделиться ею здесь.
Изменить: Вероятно, я придумал что-то вроде этого /physics/296767/multiple-colliding-balls
источник