Смешивание нескольких форм на одном теле

В библиотеке Oimo.js физическое тело (RigidBody) может быть составным, объединяющим несколько геометрических форм (Shape). Это позволяет создавать сложные объекты с разнообразной физикой, которые невозможно смоделировать одной простой формой. Каждая форма добавляется к телу независимо, при этом сохраняются общие свойства массы, инерции и взаимодействия с другими объектами сцены.

Ключевой момент — каждая форма имеет локальные параметры относительно тела: позицию, ориентацию и свойства материала (жесткость, трение, упругость). Тело воспринимается как единый объект, но физический движок учитывает каждую форму при расчёте столкновений, реакции на силы и моменты.


Создание тела с несколькими формами

// Создание динамического тела
let body = world.add({
    type: "rigid",
    pos: [0, 5, 0],
    rot: [0, 0, 0],
    move: true,
    shapes: [
        { type: "box", size: [2, 1, 1], pos: [0, 0, 0] },
        { type: "sphere", size: [0.5], pos: [0, 1, 0] },
        { type: "cylinder", size: [0.3, 1], pos: [-1, 0, 0], rot: [0, 0, Math.PI/2] }
    ]
});
  • shapes — массив объектов, описывающих формы.
  • Каждая форма может иметь индивидуальные размеры (size), позицию (pos) и вращение (rot).
  • type указывает тип геометрии: "box", "sphere", "cylinder", "capsule".

Каждая форма автоматически добавляется к телу и учитывается при вычислении столкновений и физической динамики.


Локальные и глобальные координаты форм

Каждая форма имеет локальные координаты относительно центра масс тела. Изменение позиции формы смещает её относительно тела, но не изменяет глобальное положение тела в мире. Это позволяет комбинировать формы, чтобы создавать сложные структуры, например:

  • Роботизированные конечности с шарнирами.
  • Комплексные препятствия для игрового уровня.
  • Объекты с выступами и углублениями.

Глобальные координаты формы вычисляются автоматически через позицию тела и локальные смещения формы. Внутренний алгоритм Oimo.js поддерживает корректное пересечение форм с другими объектами сцены.


Масса и инерция

При добавлении нескольких форм к телу важно учитывать массовое распределение. Oimo.js вычисляет общую массу и тензор инерции тела исходя из свойств всех форм. Если необходимо, можно задавать массу каждой формы через параметр density:

shapes: [
    { type: "box", size: [2, 1, 1], pos: [0, 0, 0], density: 2 },
    { type: "sphere", size: [0.5], pos: [0, 1, 0], density: 1 }
]

Это позволяет контролировать центр масс и поведение тела при вращении. Неравномерное распределение массы приведет к наклонному падению, зависящему от момента инерции.


Коллизии и физика столкновений

Все формы на одном теле участвуют в коллизиях одновременно. При контакте с другим объектом движок выполняет следующие шаги:

  1. Определяет, какие формы участвуют в столкновении.
  2. Вычисляет точку и нормаль контакта для каждой формы.
  3. Суммирует силы и моменты для всего тела.

Это позволяет создавать объекты с нестандартными формами, которые взаимодействуют с окружением точно и реалистично. Например, тело с коробкой и цилиндром одновременно может катиться, скользить или опрокидываться, учитывая форму каждого элемента.


Изменение форм после создания тела

Oimo.js поддерживает возможность добавления или удаления форм динамически:

// Добавление новой сферы к существующему телу
body.addShape({ type: "sphere", size: [0.3], pos: [1, 0, 0] });

// Удаление формы по индексу
body.removeShape(0);

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


Рекомендации по эффективному использованию

  • Использовать минимальное количество форм, если точность столкновений не критична, для повышения производительности.
  • Комбинировать примитивные формы (box, sphere, cylinder) вместо сложных мешей.
  • Контролировать центр масс через расположение форм для предсказуемой физики.
  • Проверять пересечения форм внутри одного тела, чтобы избежать самоконфликта коллизий.

Примеры практического применения

  1. Машины и транспортные средства — тело с кузовом (box) и колесами (cylinder).
  2. Игровые персонажи — комбинированные формы для туловища, головы и конечностей.
  3. Декоративные объекты — сложные конструкции с выступами и отверстиями, которые могут взаимодействовать с физикой сцены.

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