@Quark_Hell
C++ программист

Как в игровых движках реализованы отскоки?

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

644d301b86c7d420421834.jpeg

Какие способы реализации взаимодействия двух тел реально используются в игровых движках?
  • Вопрос задан
  • 283 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Если вместо синусов и косинусов использовать вектора, то формулы будут сильно проще. Все изменения происходят вдоль нормали соприкосновения. А там одномерная формула вообще: проецируете скорости на нормаль, потом считаете коэффициенты изменений одной и другой скорости, чтобы сохранился импульс и энергия. Потом прибавляете вектора изменений к векторам скоростей. Вместо синусов/косинусов считаете векторное/скалярное произведение векторов.

В движках чаще всего проверяются коллизии - если 2 коллайдера (фигуры, описывающие тело, часто упрощенные) пересекаются, то находится нормаль соприкосновения, и применяются веторные формулы для изменения скорости.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
trapwalker
@trapwalker
Программист, энтузиаст
А что вам не понравилось в приведенных формулах? Они совсем не сложные.
Правда в векторной форме записать закон сохранения импульса можно гораздо компактнее, а некоторые языки вроде питона позволили бы в комплексных числах записать формулу прямо в векторной форме для плоского случая. Но можно записать и так, как здесь приведено у вас.

У вас тут довольно простой случай столкновения точечных масс, но в физических движках обычно коллизии предусматривают более натуральные взаимодействия с вклчением вращения, как отдельной степени свободы. В этом случае играют важную роль размеры, формы и координаты центов масс сталкивающихся объектов. В этом случае формулы будут посложнее, но дифуры также по-прежнему считать не обязательно. Просто закон сохранения импульса и аккуратный учет всех составляющих.
Оишите подробнее вашу задачу, потому что сейчас это можно сделать совсем просто, как в пинболле, или сложно с гравитацией и через дифуры.
Ответ написан
Griboks
@Griboks
Современные движки достаточно сложные. Поэтому рекомендую вам начать с обычного абсолютно упругого удара двух материальных точек в тангециальной (х) и нормальной (у) компонентах. Это будут простые 4 формулы типа сложить, вычесть, умножить, разделить.
Ответ написан
Комментировать
@code_panik
Какие способы реализации взаимодействия двух тел реально используются в игровых движках?

Отскок - один из вариантов разрешения коллизий. Тема очень большая, ответы можно найти по запросам collision detection, collision resolution, collision response. Примеры материала:
https://blog.winter.dev/2020/designing-a-physics-e...
https://realtimecollisiondetection.net/books/rtcd/
Интересно, что каждое столкновение генерирует сигнал-событие, который должен быть обработан движком. Представьте, что у вас множество шариков падают на пол в ограниченном стенами пространстве. Шарики ударяются друг об друга, теряя энергию. Расстояния между ними становятся всё меньше, и в конечном итоге движок регистрирует такое количество событий, что всё виснет, и сам движок занимается только обработкой коллизий. Такое поведение нужно иметь в виду и обрабатывать соответствующим образом. То есть разрешение коллизий зависит от желаемых результата и точности симуляции. Например, в sokoban или тетрисе достаточно останавливаться в момент регистрации коллизии, в примере с шарами у нас continuous collision.
Примеры того, как сделано в реальных движках можно найти в выступлениях разработчиков на gdc, напр. https://www.gdcvault.com/play/1017644/Physics-for-...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы