Пространство имён OimoPhysics и экспортируемые классы

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

Пространство имён OimoPhysics

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

  • Мир (World) — основной контейнер для симуляции физических объектов.
  • Тела (RigidBody) — объекты с массой и формой, участвующие в столкновениях.
  • Формы (Shape) — геометрические описания тел, такие как куб, сфера, капсула или цилиндр.
  • Джойнты (Joint) — соединения между телами для ограничения их взаимного движения.

Использование пространства имён позволяет вызывать классы и функции через явную цепочку, например:

const world = new OimoPhysics.World();
const boxShape = new OimoPhysics.BoxGeometry(1, 1, 1);

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

Класс World

Класс World является ядром симуляции. Он управляет списком всех тел, форм и джойнтов, рассчитывает физические взаимодействия и обновляет позиции объектов в пространстве. Основные методы класса:

  • addRigidBody(body) — добавляет тело в симуляцию.
  • step(deltaTime) — выполняет шаг симуляции с заданным шагом времени deltaTime.
  • removeRigidBody(body) — удаляет тело из мира.
  • clear() — очищает все объекты и джойнты.

Конструктор World позволяет задавать параметры глобальной физики, такие как сила гравитации:

const world = new OimoPhysics.World({
    gravity: [0, -9.81, 0],
    timestep: 1 / 60,
    iterations: 8
});

Класс RigidBody

RigidBody описывает физическое тело с массой, инерцией и взаимодействием с другими объектами. Основные свойства и методы:

  • mass — масса тела.
  • position — вектор позиции в пространстве.
  • velocity — текущая скорость.
  • angularVelocity — угловая скорость.
  • addShape(shape) — привязывает форму к телу.
  • applyForce(force, point) — прикладывает силу в заданной точке.
  • applyTorque(torque) — прикладывает крутящий момент.

Примеры создания тела и добавления формы:

const body = new OimoPhysics.RigidBody({
    type: 'dynamic',
    mass: 2,
    position: [0, 5, 0]
});
body.addShape(new OimoPhysics.BoxGeometry(1, 1, 1));
world.addRigidBody(body);

Типы тел могут быть:

  • dynamic — подвержены всем законам физики.
  • static — неподвижные, но могут взаимодействовать с другими телами.
  • kinematic — задаются анимацией, участвуют в столкновениях, но не реагируют на силы.

Геометрические формы (Shapes)

Классические формы для тела включают:

  • BoxGeometry(width, height, depth) — прямоугольный параллелепипед.
  • SphereGeometry(radius) — сфера.
  • CapsuleGeometry(radius, height) — капсула.
  • CylinderGeometry(radiusTop, radiusBottom, height) — цилиндр.

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

Джойнты (Joint)

Джойнты обеспечивают ограничения между телами. Основные типы:

  • DistanceJoint — поддерживает фиксированное расстояние между телами.
  • HingeJoint — вращение вокруг оси с ограничением угла.
  • BallJoint — свободное вращение вокруг точки соединения.
  • SliderJoint — ограниченное линейное движение по оси.

Конструктор джойнта принимает два тела и объект параметров:

const joint = new OimoPhysics.HingeJoint(bodyA, bodyB, {
    anchor: [0, 1, 0],
    axis: [0, 0, 1],
    lowerLimit: -Math.PI / 4,
    upperLimit: Math.PI / 4
});
world.addJoint(joint);

Джойнты позволяют моделировать механизмы, двери, рычажные системы и цепные соединения.

Дополнительные классы и структуры

  • Vec3 — класс векторов для позиционирования и силы. Обеспечивает операции сложения, вычитания, нормализации, скалярного и векторного произведения.
  • Quaternion — описывает вращение тела в пространстве, критичен для стабильной симуляции угловых движений.
  • Material — физические свойства тела, включая коэффициенты трения и упругости.
  • Contact — информация о столкновении двух тел, включая нормаль, точку контакта и силу импульса.

Экспорт и модульность

Все перечисленные классы и структуры экспортируются через пространство имён OimoPhysics, что обеспечивает удобство подключения:

import * as OimoPhysics from 'oimo';

Либо при использовании глобальной сборки через <script> все классы доступны через window.OimoPhysics.

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