javascript42
Главная
Все учебники
Блог
Учебник Ammo.js
Введение в физическое моделирование на вебе
Зачем нужна физика в браузере
Обзор существующих физических движков для JavaScript
Место Ammo.js среди других решений
Bullet Physics как основа Ammo.js
Emscripten и компиляция C++ в WebAssembly
Ограничения и сильные стороны Ammo.js
Где применяется Ammo.js: игры, симуляции, визуализации
Установка и настройка окружения
Подключение Ammo.js через CDN
Установка через npm и сборщики модулей
Версии библиотеки: asm.js и WebAssembly
Асинхронная инициализация через Ammo()
Структура модуля после инициализации
Настройка проекта с Webpack и Vite
Интеграция с TypeScript: типизация и объявления
Совместное использование с Three.js: базовая связка
Архитектура и ключевые концепции
Мир физики: btDiscreteDynamicsWorld
Диспетчер столкновений и алгоритм широкой фазы
Решатель ограничений
Жизненный цикл симуляции
Система координат и единицы измерения
Детерминизм и воспроизводимость симуляций
Управление памятью: Emscripten heap и утечки
Ручное освобождение объектов через Ammo.destroy()
Математические примитивы
btVector3: создание, операции, нормализация
btQuaternion: создание из углов Эйлера и осей
btTransform: позиция и ориентация тела
btMatrix3x3: работа с матрицами вращения
Преобразования между системами координат
Интеграция математики Ammo.js с Three.js (Vector3, Quaternion)
Формы столкновений
Обзор иерархии классов форм
btBoxShape: параметры и создание
btSphereShape
btCapsuleShape, btCylinderShape, btConeShape
btStaticPlaneShape: бесконечная плоскость
btConvexHullShape: выпуклая оболочка по точкам
btBvhTriangleMeshShape: точная сетка для статики
btConvexTriangleMeshShape: выпуклая сетка для динамики
btCompoundShape: составные формы из нескольких примитивов
btHeightfieldTerrainShape: ландшафт по карте высот
btMultiSphereShape
Выбор формы в зависимости от задачи
Масштабирование форм через setLocalScaling
Отладочная визуализация форм столкновений
Твёрдые тела
Понятие rigid body в контексте Bullet
btRigidBodyConstructionInfo: параметры конструктора
Масса и инерция: btVector3 localInertia
Расчёт локальной инерции через calculateLocalInertia
Создание статических тел (масса = 0)
Создание кинематических тел
Создание динамических тел
Флаги тела: CF_STATIC_OBJECT, CF_KINEMATIC_OBJECT, CF_NO_CONTACT_RESPONSE
Добавление тела в мир и удаление
Линейная и угловая скорость
Применение сил: applyCentralForce, applyForce
Применение импульсов: applyCentralImpulse, applyImpulse
Применение крутящего момента: applyTorque, applyTorqueImpulse
Гравитация отдельного тела
Линейное и угловое затухание
Факторы линейного и углового движения: LinearFactor, AngularFactor
Фрикция и отскок: setFriction, setRestitution
Спящий режим: порог активации и деактивация
Принудительная активация: activate, setActivationState
Получение позиции и ориентации через MotionState
MotionState и синхронизация графики
Интерфейс btMotionState
btDefaultMotionState: реализация по умолчанию
Создание пользовательского MotionState на JavaScript
getWorldTransform и setWorldTransform
Синхронизация mesh Three.js с телом через MotionState
Оптимизация: обновление только активных тел
Интерполяция состояний для плавной анимации
Обнаружение столкновений
Широкая фаза: btDbvtBroadphase, btAxisSweep3
Узкая фаза и алгоритмы GJK/EPA
Группы и маски столкновений
Фильтрация столкновений через группы
Получение списка контактов: btPersistentManifold
Итерация по контактным точкам
Данные контакта: нормаль, глубина проникновения, позиция
Ghost-объекты: btGhostObject и btPairCachingGhostObject
Использование ghost-объектов как триггеров
ContactTest: проверка конкретного тела на столкновения
ContactPairTest: проверка пары тел
Коллбэки столкновений
Механизм коллбэков в Ammo.js
Реализация onContactAdded
Реализация onContactProcessed
Реализация onContactDestroyed
Передача пользовательских данных через setUserPointer и getUserPointer
Паттерн связывания физических тел с игровыми объектами
Практические сценарии: урон, звук, эффекты при ударе
Ограничения и соединения
Обзор классов constraints
btPoint2PointConstraint: шаровой шарнир
btHingeConstraint: петля с ограничением угла
btSliderConstraint: линейное скольжение
btConeTwistConstraint: конусное вращение
btGeneric6DofConstraint: общие 6 степеней свободы
btGeneric6DofSpring2Constraint: пружинные степени свободы
btFixedConstraint: жёсткое соединение
Моторы в ограничениях: включение и параметры
Пружины в 6DoF: жёсткость и демпфирование
Опорные фреймы: локальные и мировые координаты
Добавление и удаление ограничений из мира
Отладка ограничений: визуализация осей
Транспортные средства
Архитектура btRaycastVehicle
btVehicleRaycaster и btDefaultVehicleRaycaster
btVehicleTuning: глобальные параметры подвески
Добавление колёс: addWheel
btWheelInfo: параметры отдельного колеса
Параметры подвески: stiffness, damping, compression
Трение колеса: skidInfo и frictionSlip
Управление: setSteeringValue, applyEngineForce, setBrake
Получение скорости и состояния колёс
Синхронизация визуальных колёс с физикой
Типичные проблемы: перевороты, дёрганье, туннелирование
Мягкие тела
btSoftRigidDynamicsWorld вместо btDiscreteDynamicsWorld
btSoftBodyWorldInfo: параметры мира мягких тел
Создание мягкого тела из сетки: btSoftBodyHelpers
Создание верёвки: CreateRope
Создание ткани: CreatePatch
Создание объёмного мягкого тела: CreateFromTriMesh
Материалы мягкого тела: жёсткость, упругость
Закрепление узлов к миру и к твёрдым телам: appendAnchor
Взаимодействие мягких и твёрдых тел
Синхронизация вершин сетки Three.js с узлами мягкого тела
Параметры решателя мягких тел: viterations, piterations
Лучевое литьё
btCollisionWorld::rayTest и ClosestRayResultCallback
AllHitsRayResultCallback: все пересечения
Фильтрация результатов по группам
Получение нормали и позиции пересечения
Raycasting для мыши: экранные координаты → луч
Raycasting для ИИ: проверка видимости и препятствий
Производительность raycast: частота вызовов и оптимизация
Производительность и оптимизация
Стоимость stepSimulation и выбор шага
Фиксированный шаг против переменного
Максимальное число подшагов
Влияние числа тел на производительность
Оптимизация форм столкновений
Спящий режим как инструмент производительности
Пул объектов: переиспользование btVector3 и btTransform
Минимизация вызовов Ammo.destroy()
Профилирование физики в DevTools
Web Workers: физика в отдельном потоке
Передача данных между потоками: SharedArrayBuffer и Transferable
Ammo.js + OffscreenCanvas + Worker: полная схема
Отладка физики
btIDebugDraw: интерфейс отладочной отрисовки
Реализация кастомного отладчика на WebGL/Three.js
Режимы отладки: wireframe, контактные точки, нормали, AABB
Визуализация ограничений и осей
Логирование контактов и коллизий
Типичные баги: объекты проваливаются, не сталкиваются, трясутся
Туннелирование и способы борьбы с ним
Численная нестабильность: причины и решения
Интеграция с рендерерами
Полная схема интеграции с Three.js
Паттерн игрового цикла: requestAnimationFrame + stepSimulation
Работа с instancedMesh для большого числа объектов
Интеграция с Babylon.js
Интеграция с PlayCanvas
Передача трансформов без лишних аллокаций
Расширенные темы
Детерминированная симуляция и сериализация состояния
btSerializer: сохранение и загрузка физического мира
Процедурная генерация форм столкновений во время выполнения
Составные тела со смещёнными центрами масс
Имитация плавучести: силы Архимеда вручную
Контроллер персонажа на основе ghost-объекта
Реализация kinematic character controller
Детектирование нахождения на земле
Физические слои для сложных игровых сцен
Взрывы: радиальный импульс по телам в радиусе
Разрушаемые объекты: дробление compound shape