javascript42
Главная
Все учебники
Блог
Учебник Oimo.js
Введение в физическое моделирование на JavaScript
Что такое физический движок и зачем он нужен
Место Oimo.js среди других физических движков
Обзор возможностей и ограничений Oimo.js
Версии библиотеки: различия между 1.x и 2.x
Установка через npm и подключение через CDN
Структура пакета и точки входа
Первый рабочий пример за пять минут
Архитектура Oimo.js
Общая схема работы движка
Цикл симуляции: шаги, итерации, время
Взаимосвязь между World, Body, Shape и Joint
Система координат и единицы измерения
Внутренний граф зависимостей объектов
Пространство имён OimoPhysics и экспортируемые классы
Роль широкой и узкой фазы обнаружения столкновений
Мир симуляции
Создание экземпляра World
Параметры конструктора WorldConfig
Гравитация: настройка вектора и динамическое изменение
Шаг симуляции: метод step и его параметры
Фиксированный и переменный временной шаг
Управление числом итераций решателя
Получение статистики через WorldInfo
Очистка и уничтожение мира
Твёрдые тела
Классификация тел: динамические, статические, кинематические
Создание тела через addRigidBody и RigidBodyConfig
Позиция и ориентация при создании тела
Масса и момент инерции: автоматический и ручной расчёт
Линейная и угловая скорость
Демпфирование: linearDamping и angularDamping
Флаг autoSleep и пороговые значения засыпания
Блокировка осей вращения и перемещения
Применение сил, импульсов и крутящих моментов
Методы applyForce, applyImpulse, applyTorque
Точка приложения силы в мировых и локальных координатах
Кинематические тела: управление через скорость
Получение и установка трансформации тела
Удаление тела из мира
Формы и геометрия столкновений
Роль Shape как коллайдера тела
Связь Shape с RigidBody через addShape
ShapeConfig: общие параметры всех форм
Смещение формы относительно тела: localTransform
Сфера: SphereGeometry и её параметры
Прямоугольный параллелепипед: BoxGeometry
Цилиндр: CylinderGeometry
Конус: ConeGeometry
Капсула: CapsuleGeometry
Выпуклый многогранник: ConvexHullGeometry
Загрузка вершин для выпуклой оболочки
Ограничения и правила построения выпуклых форм
Смешивание нескольких форм на одном теле
Влияние формы на расчёт инерции
Материалы и физические свойства поверхностей
Понятие материала в контексте Oimo.js
Коэффициент трения: статическое и динамическое трение
Комбинирование трения двух тел при столкновении
Коэффициент упругости (restitution) и его диапазон
Комбинирование упругости при столкновении
Плотность и её влияние на массу
Настройка contactCallback на уровне Shape
Обнаружение столкновений
Широкая фаза: BroadPhase и её алгоритмы
BVH-дерево как структура ускорения
Узкая фаза: алгоритм GJK и EPA
Контактные многообразия и точки контакта
Нормаль и глубина проникновения
Фильтрация столкновений через collision groups
Битовые маски: collisionGroup и collisionMask
Отключение столкновений между конкретными парами тел
ContactCallback: подписка на события контакта
Методы beginContact, persistContact, endContact
Получение информации о контакте через ContactInfo
Итерация по всем активным контактам мира
Ограничения и суставы
Концепция суставов в физическом движке
Общие параметры JointConfig
Якорные точки в мировых и локальных координатах
Шаровой сустав: SphericalJoint
Шарнирный сустав: RevoluteJoint
Настройка пределов вращения RevoluteLimitMotor
Моторный привод RevoluteJoint
Призматический сустав: PrismaticJoint
Пределы и мотор для поступательного движения
Цилиндрический сустав: CylinderJoint
Универсальный сустав: UniversalJoint
Шарнир с фиксацией: GenericJoint
Матрица допуска в GenericJoint: свободные и зафиксированные степени свободы
Жёсткость и демпфирование суставов через SpringDamper
Breakable joints: разрушение суставов по силе
Удаление сустава из мира
Решатель ограничений
Итерационный импульсный решатель
Параметр numPositionIterations
Параметр numVelocityIterations
Влияние числа итераций на точность и производительность
ERP: коэффициент восстановления ошибки позиции
CFM: коэффициент смягчения ограничений
Warm starting и его роль в стабильности
Решение проблем дрожания и взрыва симуляции
Режим сна и оптимизация активных тел
Алгоритм определения покоящихся тел
Пороги линейной и угловой скорости для сна
Принудительное пробуждение через wakeUp
Острова симуляции и групповое засыпание
Отладка: отображение спящих тел
Трассировка лучей
Метод rayCast и его сигнатура
Параметры начала и конца луча
RayCastClosest: ближайшее пересечение
RayCastAll: все пересечения вдоль луча
Фильтрация луча через collision mask
Данные результата: тело, точка, нормаль
Практические применения: прицеливание, подбор объектов, детектирование поверхностей
Отладка и визуализация
Класс DebugDraw и его интерфейс
Реализация собственного рендерера для DebugDraw
Отрисовка коллайдеров, суставов и контактов
Интеграция DebugDraw с Three.js
Интеграция DebugDraw с Babylon.js
Интеграция DebugDraw с Canvas 2D
Цветовое кодирование состояний тел
Вывод диагностической информации в консоль
Интеграция с Three.js
Синхронизация положения Mesh и RigidBody
Синхронизация кватернионов ориентации
Организация цикла requestAnimationFrame с фиксированным шагом физики
Накопление времени и интерполяция состояния
Утилитарный класс-обёртка для синхронизации объектов
Работа с инстансированием: InstancedMesh и массив тел
Сцены с большим числом объектов: пулинг и переиспользование
Интеграция с Babylon.js
Структура физического плагина в Babylon.js
Прямое использование Oimo.js без официального плагина
Синхронизация AbstractMesh с RigidBody
Обработка масштабирования и Babylon-координат
Физика в Babylon.js Havok vs Oimo.js: когда что выбирать
Производительность и профилирование
Измерение времени шага симуляции
Влияние числа тел на производительность
Влияние типа геометрии на скорость узкой фазы
Рекомендации по выбору форм для производительности
Пространственное разбиение и его настройка
Уменьшение числа активных контактов
Оффлодинг симуляции в Web Worker
Передача данных между потоками через SharedArrayBuffer
Сериализация и десериализация состояния мира
Работа с Web Worker
Архитектура двухпоточного приложения
Инициализация Oimo.js внутри Worker
Протокол обмена сообщениями: команды и обновления
Передача трансформаций через TypedArray
Синхронизация рендеринга и физики без блокировки основного потока
Обработка пользовательского ввода из основного потока
Детерминизм и воспроизводимость симуляции
Динамическое управление сценой
Добавление и удаление тел в реальном времени
Изменение типа тела во время симуляции
Телепортация тела: сброс скоростей при перемещении
Изменение геометрии: удаление и добавление Shape
Динамическое создание и разрыв суставов
Реакция на игровые события: взрывная волна, подъёмная сила
Расчёт взрывного импульса по расстоянию
Математические утилиты библиотеки
Классы Vec3 и Mat3: операции с векторами и матрицами
Класс Quat: кватернионы и операции над ними
Класс Transform: совмещение позиции и ориентации
Преобразования между системами координат
Интерполяция трансформаций для рендеринга
Расширенные темы
Непрерывное обнаружение столкновений: принципы и ограничения
Составные тела из множества форм: плюсы и особенности
Физика мягких тел: чего нет в Oimo.js и как эмулировать
Верёвки и цепи из связанных тел
Транспортные средства: колёса на RevoluteJoint и PrismaticJoint
Симуляция тряпичной куклы
Физика жидкостей: частичная эмуляция через силы
Детерминированная симуляция и сетевая синхронизация
Портирование проектов с Cannon.js на Oimo.js
Портирование проектов с Ammo.js на Oimo.js