Библиотека Oimo.js реализует физический движок для
JavaScript с фокусом на динамическое взаимодействие твердых тел. Одним
из ключевых элементов является использование выпуклых форм
(convex shapes) для моделирования коллизий. Понимание
ограничений и правил построения таких форм критично для стабильной
работы симуляции.
1. Принцип выпуклости
Выпуклая форма — это форма, у которой любая прямая,
соединяющая две точки внутри объекта, полностью лежит внутри объекта. В
Oimo.js это основное требование для всех convex hulls,
используемых в расчете столкновений. Нарушение этого принципа приводит
к:
- Некорректным контактам;
- “Протеканию” объектов через коллайдеры;
- Сильной нестабильности симуляции.
Для сложных объектов, имеющих полости или вогнутые участки,
необходимо разбиение на несколько выпуклых частей.
2. Ограничения на
количество вершин и граней
Oimo.js накладывает жесткие ограничения на число вершин и
граней:
- Максимальное количество вершин: 64–128 на одну
convex форму (в зависимости от версии движка и платформы);
- Максимальное число граней: обычно ограничено
128–256. Превышение этих значений приводит к ошибкам при инициализации
формы или некорректному расчету столкновений.
Рекомендовано упрощать модели перед импортом в движок, используя
алгоритмы convex hull simplification или заранее делая
декомпозицию сложных мешей на несколько convex форм.
3. Правила построения вершин
- Вершины должны быть точно определены в локальных координатах
тела, иначе форма не будет правильно позиционироваться
относительно Rigidbody.
- Все вершины должны лежать в одной общей выпуклой
оболочке.
- Избыточные или почти коллинеарные точки лучше удалять, чтобы
уменьшить вычислительную нагрузку и избежать численных ошибок.
- Порядок вершин не критичен, однако для стабильной генерации convex
hull предпочтительно, чтобы они были равномерно распределены по
поверхности.
4. Учет размеров и масштабов
- Oimo.js не поддерживает формы с очень маленькими или очень большими
размерами (например, меньше 0.001 или больше 1000 в единицах симуляции).
Это вызовет нестабильность интегратора.
- Масштабирование готовой формы вручную может нарушить её выпуклость.
Правильнее пересчитывать convex hull после изменения масштаба.
5. Декомпозиция сложных форм
Для объектов с выемками или вогнутыми частями применяют метод
декомпозиции на несколько convex форм:
- Определение областей, которые можно представить как отдельные convex
hulls.
- Создание отдельного Oimo.Shape для каждой области.
- Объединение форм через compound body
(Oimo.RigidBody с несколькими shapes).
Пример структуры:
let body = new OIMO.RigidBody({
type: 'dynamic',
shapes: [
{ type: 'box', size: [1,1,1], pos: [0,0,0] },
{ type: 'box', size: [0.5,0.5,0.5], pos: [1,0,0] }
]
});
6. Ограничения по коллизиям
- Не допускаются самопересекающиеся формы. Даже если
они кажутся визуально корректными, физический движок не сможет корректно
рассчитать столкновения.
- Формы должны быть однородно плотными, без “тонких”
элементов толщиной менее 0.01, чтобы избежать проскакивания через другие
объекты при высокой скорости.
7. Проверка корректности
convex формы
Для обеспечения стабильной работы рекомендуются следующие шаги:
- Визуальная проверка: убедиться, что все вершины
находятся на поверхности объекта.
- Алгоритмическая проверка: использовать алгоритмы
построения convex hull (например, QuickHull) для генерации вершин.
- Тестовые столкновения: запуск симуляции с базовыми
телами (box, sphere) для проверки корректности контактов.
- Снижение точности вычислений: если возникают мелкие
“дрожания”, проверять нормализацию вершин и упрощать модель.
8. Практические советы
- Использовать стандартные примитивы Oimo.js (box,
sphere, cylinder) для упрощения сцены.
- Для нестандартных форм применять инструменты внешней
генерации convex hull, а не вручную задавать вершины.
- Избегать масштабирования сложных форм после генерации convex
hull.
- Разбивать большие mesh-объекты на несколько convex форм для
улучшения производительности.
Эти правила и ограничения обеспечивают стабильную физическую
симуляцию и корректную работу столкновений в Oimo.js, минимизируя
ошибки, связанные с численной нестабильностью и некорректными convex
hulls.