ShapeConfig: общие параметры всех форм

В библиотеке Oimo.js объект ShapeConfig представляет собой универсальную конфигурацию для всех физических форм. Он используется для задания физических свойств тела, которые влияют на взаимодействие с другими объектами в симуляции: столкновения, трение, упругость и массу. ShapeConfig не зависит от конкретного типа формы — будь то куб, сфера, цилиндр или меш.

Ключевые параметры ShapeConfig

  1. density — плотность объекта Параметр определяет массу объекта относительно его объёма. Масса вычисляется как произведение плотности на объём формы:

    shapeConfig.density = 1.0; // кг/м³

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

  2. friction — коэффициент трения Определяет сопротивление скольжению между контактирующими формами. При трении 0 объекты скользят без сопротивления, при трении 1 — движение почти полностью блокируется:

    shapeConfig.friction = 0.5;

    Трение влияет как на линейное движение, так и на вращение тела при контакте с поверхностью.

  3. restitution — коэффициент упругости Определяет, насколько объект отскакивает при столкновении. Значение от 0 (абсолютно неупругое столкновение) до 1 (идеально упругое):

    shapeConfig.restitution = 0.8;

    Этот параметр критичен при моделировании шаров, мячей и любых объектов, где важна динамика отскоков.

  4. collisionGroup и collisionMask — управление коллизиями Позволяют задавать группы столкновений. collisionGroup определяет принадлежность формы к определённой группе, а collisionMask — с какими группами объект может сталкиваться:

    shapeConfig.collisionGroup = 1;
    shapeConfig.collisionMask = 0xFFFFFFFF; // столкновения со всеми

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

  5. isTrigger — триггерное тело Булевый параметр, указывающий, что форма не участвует в физическом взаимодействии, а лишь сообщает о контакте:

    shapeConfig.isTrigger = false;

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

Настройка формы через ShapeConfig

Формы создаются через конструкторы конкретного типа, например Box, Sphere, Cylinder, и используют экземпляр ShapeConfig для задания физических свойств:

const config = new OIMO.ShapeConfig();
config.density = 2.0;
config.friction = 0.4;
config.restitution = 0.6;

const box = new OIMO.Box(config, new OIMO.Vec3(1, 1, 1));

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

Взаимодействие с телами (RigidBody)

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

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

const body = new OIMO.RigidBody(bodyConfig);
body.addShape(box); // box использует shapeConfig

Расширенные возможности

  • localOffset — смещение формы относительно центра тела Позволяет корректировать расположение коллайдера без изменения геометрии:

    shapeConfig.localOffset = new OIMO.Vec3(0, 1, 0);
  • localRotation — поворот формы относительно тела Используется для наклонных или ориентированных коллайдеров:

    shapeConfig.localRotation = new OIMO.Mat3().fromEuler(0, Math.PI/4, 0);
  • groupId — дополнительная идентификация для пользовательской логики Может применяться для фильтрации столкновений на уровне скриптов, вне стандартных групп Oimo.js.

Практические советы

  • Для динамических объектов оптимально задавать density и restitution в зависимости от желаемого поведения. Тяжёлые объекты с низкой упругостью почти не отскакивают.
  • Для пола и стен лучше использовать триггерные объекты с высокой стабильностью и нулевой плотностью, чтобы исключить неожиданные смещения.
  • В системах с множеством форм использование collisionGroup и collisionMask значительно ускоряет расчёт столкновений.

Использование ShapeConfig позволяет гибко управлять физикой объекта на уровне формы, обеспечивая точное моделирование столкновений, трения и динамики в 3D-мире Oimo.js.