Я использую следующий подход (похожий на алгоритм массового расщепления Тонге http://www.richardtonge.com/ ):
- обнаружить все сталкивающиеся пары в вашей сцене / контексте. Пусть (A, B) такая пара. Примените идею расщепления призрака / массы: если A контактирует с телами M, а B контактирует с N другими телами, тогда временно установите массу A на,
m_A/M
а массу B наm_B/N
- вычислить вклады силы реакции / восстановления для каждой пары (A, B) и сохранить эти вклады в собственных аккумуляторах A и B
- Вычислите скорости восстановления из импульсов (как вы указали) и сохраните их таким же образом (как остатки скорости deltaV в их собственных аккумуляторах для каждой пары (A, B))
- вычислять штрафные перемещения (опять же, накапливать перемещения, не применять их мгновенно!)
- сбросить массы всех тел, ранее обозначенных как стороны в парах столкновений (
m_A = m_A * M
и m_B = m_B * N
)
Этот подход аналогичен тому, как итерационный алгоритм Якоби работает с линейными одновременными системами уравнений. И не гарантируется сходство, но в моем симуляторе это делает работу довольно плавно ... в 3D (да, дополнительное измерение увеличивает вдвое сложность!).
Предостережение : исправляйте положения и скорости только после завершения фазы обнаружения / обработки столкновений! Таким образом вы одновременно обновляете своих сталкивающихся актеров. Кроме того, силы восстановления должны быть приняты во внимание в следующий раз, когда вы интегрируете позиции и скорости.
РЕДАКТИРОВАТЬ: Ну, я думаю, что вы используете уже используемый метод интеграции Verlet (этот стал нарицательным среди энтузиастов Gamedev). В этом спектре обработки столкновений и интеграции вы можете посмотреть здесь .
ОБНОВЛЕНИЕ: Некоторая информация о том, как приблизиться к столкновению (и собственно столкновению в этом отношении), может быть найдена в этих статьях:
Предложенный мною подход далеко не является оригинальным вкладом, многие игры используют его с правдоподобными результатами, и его лучше всего использовал Якобсен в своем игровом движке Hitman.
Исходя из некоторого практического опыта, штрафные силы (аналогичные линейным или экспоненциальным пружинам, получающим свои входные данные от расстояния проникновения) не могут должным образом разрешить проникновения, когда другие силы от сталкивающихся тел могут быть больше, чем они. Вот почему я решил объединить три (почти избыточных) подхода: ньютоновские силы реакции (вы толкаете стену, стена отодвигается назад), полученные из импульса скорости (столкновение шаров для снукера) и неестественное «геометрически отодвигают тела друг от друга» " решение. Вместе они, кажется, обеспечивают все: избавиться от большинстваУжасные артефакты взаимопроникновения, сталкивающиеся тела имеют тенденцию взаимодействовать друг с другом в долгосрочной перспективе (из-за скоростей и сил восстановления - по крайней мере, силы, которые имели тенденцию тянуть тела в сценарии столкновения, устраняются, и тела отскакивают друг от друга) , Наконец, для дальнейшего понимания этих простых, но общих концепций, я предлагаю проанализировать эти слайды .
Мой эпитет «метод злоупотребления», описывающий шаги интеграции Verlet, нацелен на убеждение популярной культуры, что это Святой Грааль методов интеграции. Это просто немного лучше, чем его кузен Симплектический Эйлер (также называемый некоторым неявным Эйлером). Существуют более сложные методы интеграции (и все они имеют неявное имя в них). Их используют мощные игровые движки, но у независимых разработчиков нет времени экспериментировать с ними, поскольку Verlet, настроенный на конкретный сценарий, действительно творит чудеса. Кроме того, нет абсолютно никакого метода интеграции, который мог бы справиться с жесткими ограничениями без небольшого обмана (не могу найти ссылку, но документ, на который я ссылаюсь, должен называться «X.Provot -» Деформационные ограничения в массе модель для описания поведения жесткой ткани "