Модернизация физического движка

В современных играх, в основном, используется «импульсная» модель физического движка. По сути это расчет импульсов и сил действующих на объект с выталкиванием объектов, либо с поиском ближайшей точки до момента контакта и перерасчетом сил. На сегодняшний день создано много физических движков, все работаю с разными погрешностями. Даже в самых основных движках, задача по оптимизации так и не решена. А именно быстрый расчет движения объекта в момент скольжения и столкновения с другими за минимальное число операций. В играх физический движок за одну секунду обычно около 60-200 раз пересчитывает сцену. В итоге результат будет верный, но на его расчет мы потратим значительно больше процессорного времени. Обычно, оптимизируют число проверок столкновения, упрощают модели создавая convex представление и другие оптимизации. Так что же можно применить, чтобы упростить расчеты?

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

Если у объекта ожидается столкновение, то:

  • Для каждого объекта необходимо рассчитать вероятность его движения исходя из окружающего мира. Убедиться может ли объект продолжить движение, не прижат ли он. По контактам рассчитать результирующий вектор движения с учетом веса объекта.
  • Для расчета столкновений брать ближайших два контакта объекта с другими объектами. И производить перерасчет сил и импульсов.

Эти два последовательных шага позволят сократить общее число расчетов необходимых для движения объектов.

В результате оптимизации: удалось добиться корректной работы физического движка всего при 30 вместо ~60-200 раз перерасчета сцены в секунду. Так же удалось исключить из расчетов объекты, которые, не способны совершать действия и уменьшить общее число расчетов, объекты переместятся на нужные позиции за меньшее число операций.

На javascript эти изменения особенно заметны, если на с++ по скорости прирост составил всего 5-30%, то на javascript по тестам получилось 20-80% прирост скорости.