Выпуклый многогранник: ConvexHullGeometry

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


Основные свойства ConvexHullGeometry

  • vertices — массив вершин объекта. Каждая вершина задаётся в виде трёх координат [x, y, z]. Эти вершины формируют выпуклую оболочку, которая и используется движком для расчёта столкновений.
  • margin — дополнительное пространство вокруг многогранника, используемое для предотвращения застреваний и точных расчётов столкновений. Обычно задаётся небольшим числом (например, 0.01).
  • mass — масса физического объекта, напрямую влияющая на динамику при симуляции.
import * as OIMO from 'oimo';

const vertices = [
  [-1, -1, -1],
  [1, -1, -1],
  [1, 1, -1],
  [-1, 1, -1],
  [-1, -1, 1],
  [1, -1, 1],
  [1, 1, 1],
  [-1, 1, 1]
];

const convexGeometry = new OIMO.ConvexHullGeometry(vertices, 0.01);

Создание выпуклого тела

Для того чтобы объект начал участвовать в физической симуляции, необходимо обернуть ConvexHullGeometry в RigidBody и добавить в мир:

const bodyConfig = new OIMO.RigidBodyConfig();
bodyConfig.type = OIMO.RigidBodyType.DYNAMIC;

const body = new OIMO.RigidBody(bodyConfig);
body.addShape(new OIMO.Shape(convexGeometry));

world.addRigidBody(body);

Ключевые моменты:

  • Тип тела (DYNAMIC, STATIC, KINEMATIC) определяет, как объект будет реагировать на силы и столкновения.
  • Обычное использование ConvexHullGeometry предполагает динамические тела, так как статические объекты проще моделировать примитивами.

Генерация вершин для сложных форм

Вершины можно генерировать из трёхмерной модели или вручную. Основное требование — все точки должны образовывать выпуклую оболочку, иначе движок сам построит минимальную выпуклую оболочку.

Пример генерации вершин для произвольного многогранника:

function generateRandomVertices(count, radius) {
  const vertices = [];
  for (let i = 0; i < count; i++) {
    const theta = Math.random() * 2 * Math.PI;
    const phi = Math.random() * Math.PI;
    const x = radius * Math.sin(phi) * Math.cos(theta);
    const y = radius * Math.sin(phi) * Math.sin(theta);
    const z = radius * Math.cos(phi);
    vertices.push([x, y, z]);
  }
  return vertices;
}

const randomVertices = generateRandomVertices(20, 1);
const randomConvex = new OIMO.ConvexHullGeometry(randomVertices, 0.02);
  • Оптимизация: чем больше вершин, тем точнее форма, но выше вычислительные затраты. Для реалистичной симуляции часто достаточно 20–50 точек.

Настройка физических свойств

  • friction — коэффициент трения. Влияет на скольжение по поверхности других тел.
  • restitution — упругость при столкновении. Значение 0 — абсолютно неупругое, 1 — идеально упругое.
  • linearDamping и angularDamping — затухание линейного и углового движения.
const shape = new OIMO.Shape(convexGeometry);
shape.friction = 0.5;
shape.restitution = 0.3;

body.addShape(shape);
body.linearDamping = 0.1;
body.angularDamping = 0.1;

Советы по производительности

  1. Сокращение количества вершин — уменьшает нагрузку на движок, ускоряет расчёты столкновений.
  2. Использование меньшего margin — уменьшает “мерцание” при столкновениях, но слишком малый margin может привести к застреваниям.
  3. Предварительная оптимизация геометрии — упрощение модели в 3D-редакторе перед экспортом вершин для Oimo.js.

Применение в играх и симуляциях

  • Моделирование нестандартных объектов: кувшины, камни, оружие сложной формы.
  • Реалистичные столкновения для процедурно сгенерированных объектов.
  • Использование вместе с графическими движками, такими как Three.js, для синхронизации визуальной модели и физики.
const mesh = new THREE.Mesh(geometry, material);
mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());

Такое взаимодействие позволяет создавать динамичные сцены с реальной физикой для сложных форм.


Рекомендации по отладке

  • Проверять, что все вершины корректно заданы в массиве vertices.
  • Для визуальной проверки использовать wireframe-сетку.
  • Использовать статические тела для тестирования правильности построения оболочки перед динамическими симуляциями.

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