Физический движок — это программный модуль, реализующий математическую модель физического мира внутри цифровой среды. Его задача — вычислять поведение объектов на основе законов механики: гравитации, инерции, столкновений, трения, импульсов и других физических явлений.
В контексте веб-разработки физический движок используется для симуляции динамики тел в браузере. Библиотека Oimo.js представляет собой JavaScript-реализацию трёхмерного физического движка, предназначенного для работы с WebGL-графикой и 3D-сценами.
Физический движок не занимается отрисовкой. Он не рисует модели, не управляет камерой и не отвечает за освещение. Его область ответственности — расчёт координат, скоростей, вращений и взаимодействий объектов во времени.
Каждый физический объект обладает набором параметров:
Движок выполняет численную интеграцию уравнений движения. На каждом шаге симуляции рассчитывается новое состояние объекта с учётом:
В Oimo.js используется дискретная временная модель: симуляция разбивается на шаги фиксированной длительности (time step), обычно 1/60 секунды.
Одной из ключевых функций является определение момента и факта пересечения объектов.
Процесс включает несколько этапов:
Broad Phase (грубая проверка) Быстрое определение потенциально пересекающихся тел с использованием упрощённых объёмов (AABB — Axis-Aligned Bounding Box).
Narrow Phase (точная проверка) Более точный анализ геометрии тел:
Результатом является информация о:
После обнаружения пересечения движок должен:
В Oimo.js используется импульсный метод решения столкновений. Он основывается на законе сохранения импульса и позволяет эффективно рассчитывать реакцию тел.
Физический движок поддерживает связи между телами:
Ограничения позволяют строить сложные механические системы: двери, мосты, цепи, транспортные средства.
Физический мир в Oimo.js обновляется по шагам:
world.step()
Каждый вызов выполняет:
Фиксированный шаг времени обеспечивает стабильность вычислений. Переменный шаг может привести к:
Физические движки разделяют объекты по типам.
Используются для коробок, шаров, персонажей, падающих объектов.
Пример: пол, стены, неподвижные платформы.
Применяются для движущихся платформ или управляемых объектов.
Физический движок различает два способа воздействия:
Воздействие, действующее во времени. Пример: постоянная тяга двигателя.
Формула:
F = m * a
Сила изменяет ускорение, а через него — скорость и положение.
Мгновенное изменение скорости. Используется при столкновениях или выстрелах.
Импульс не накапливается во времени — он сразу корректирует скорость.
Глобальная сила, применяемая ко всем динамическим телам. В Oimo.js она задаётся при создании мира:
new OIMO.World({ gravity: [0, -9.8, 0] })
Физический движок не решает уравнения движения аналитически. Используется численная интеграция:
Чем меньше шаг времени, тем точнее симуляция, но тем выше вычислительная нагрузка.
В Oimo.js мир (World) содержит:
Структура взаимодействия:
World
├── Bodies
├── Shapes
├── Contacts
└── Constraints
Каждое тело может содержать одну или несколько форм (Shapes), определяющих его геометрию для расчётов.
Анимация задаёт движение вручную: координаты определяются заранее.
Физический движок:
Например:
Без физического движка подобное поведение пришлось бы программировать вручную для каждого случая.
Физический движок в браузере используется для:
Oimo.js особенно удобен в сочетании с WebGL-библиотеками, где физика рассчитывается отдельно, а графика лишь отображает текущее состояние объектов.
Физические движки реального времени работают с приближённой моделью. Это означает:
Баланс достигается между:
Без физического движка невозможно:
В контексте Oimo.js физический движок превращает набор 3D-моделей в полноценную динамическую сцену, где объекты подчиняются законам механики и взаимодействуют друг с другом автоматически.