Возвращаюсь к физике движка
Прошло больше четырех лет с момента когда я работал над физикой и обнаружением коллизий в своем движке. С того момента я к этому коду практически не притрагивался. Перевел на тайпскрипт разве что.
С физикой все понятно. А что такое обнаружение коллизий и зачем это нужно? Вот есть у нас два объекта, и, допустим, они столкнулись. Их столкновение – это коллизия. Информацию о столкновении можно использовать для той же физики, чтобы персонаж в платформере не провалился сквозь землю и не падал бесконечно вниз или для игровых механик таких как стрельба башен в нашей последней игре, где при столкновении снаряда с мышью, снаряд уничтожался, а мышь получала урон. Задача непростая, поскольку объектов может быть много, геометрия объекта может представлять собой многоугольник повернутый в пространстве да и помимо факта столкновения зачастую требуется дополнительная информация о точке контакта или вектора столкновения.
Когда я взялся за эту задачу в первый раз, то практически ничего не понимал и даже нагуглить нужные материалы не мог, поскольку не знал что искать и какие ключевые слова использовать. В итоге я сидел, обложившись научными статьями с Киберленинки и понимал примерно 20 процентов из прочитанного.
В результате, я написал набор систем, которые умеют регистрировать столкновения между простыми фигурами такими как круг или прямоугольник выравненный вдоль координатных осей и расталкивать их. Код, эмулирующий физику, позволил прикладывать векторы силы и импульса к объектам, а также оказывать действие гравитации на них если потребуется. Этого хватало для игр, которые я писал все это время, но хочется иметь возможность делать что-то более сложное. К примеру, чтобы движок позволял составить башню из блоков как в Дженге, при вытаскивании которых, башня начинает шататься и разваливаться.
Я уже начал работать над улучшениями еще до Людума и далее планирую продолжать. Как минимум задачи следующие:
- возможность поворачивать коллайдеры
- поддержка угловой скорости, чтобы при столкновении объекты могли разворачиваться относительно точки приложенной силы
- ray casting. Это функция, позволяющая выпустить луч из заданной точки и получить список объектов-попаданий. Полезно для AI или стрельбы в шутерах
- упругие столкновения объектов и возможность передачи кинетической энергии
- пространственное разделение (spatial partitioning) чтобы оптимизировать количество попарных проверок. Может быть такие оптимизации в небольших играх и не понадобятся, но интересно разобраться, что это за зверь такой + хорошая возможность применить на практике сложные структуры данных
В целом, с прошлого раза ничего не изменилось – что и как делать непонятно, поэтому я сел за научные статьи. Наткнулся на туториалы по физике на сайте гейм дев факультета британского университета – довольно увлекательно да и там не только про физику материалы есть.