В Oimo.js каждая физическая сущность определяется через объект
RigidBody, который содержит сведения о типе тела, массе,
инерции, положении и ориентации. Тип тела задаётся через параметр
type и может принимать значения:
OIMO.RigidBodyType.STATIC —
статическое тело, не подверженное силам и столкновениям;OIMO.RigidBodyType.DYNAMIC —
динамическое тело, полностью участвует в симуляции, реагирует на силы,
гравитацию и столкновения;OIMO.RigidBodyType.KINEMATIC —
кинематическое тело, управляется вручную через позиции, но влияет на
динамические тела через столкновения.Смена типа тела во время симуляции позволяет динамически изменять поведение объектов, например, делать объект неподвижным при достижении определённого состояния или временно отключать физику для оптимизации.
Для изменения типа тела используется метод
setType(type), который обновляет внутренние параметры
RigidBody. Пример:
// Сделать тело динамическим
body.setType(OIMO.RigidBodyType.DYNAMIC);
// Сделать тело статическим
body.setType(OIMO.RigidBodyType.STATIC);
// Сделать тело кинематическим
body.setType(OIMO.RigidBodyType.KINEMATIC);
Важно учитывать, что смена типа тела не сохраняет текущие скорости автоматически. Если тело переключается из динамического в статическое, его линейная и угловая скорости будут сброшены. Чтобы сохранить движение при обратном переключении на динамическое, нужно вручную сохранять значения:
let linearVelocity = body.getLinearVelocity().clone();
let angularVelocity = body.getAngularVelocity().clone();
body.setType(OIMO.RigidBodyType.STATIC);
// позже возвращаем динамическое тело и восстанавливаем скорости
body.setType(OIMO.RigidBodyType.DYNAMIC);
body.setLinearVelocity(linearVelocity);
body.setAngularVelocity(angularVelocity);
Кинематические тела управляются напрямую через позиции и вращения с
помощью методов setPosition() и
setQuaternion():
body.setPosition(new OIMO.Vec3(x, y, z));
body.setQuaternion(new OIMO.Quat().setFromEuler(rx, ry, rz));
При смене динамического тела на кинематическое необходимо учитывать столкновения: кинематическое тело влияет на динамические, но не получает силы обратно. Поэтому при планировании анимаций или перемещений следует корректировать скорость и траекторию объектов вручную.
Oimo.js использует контактные группы и маски для фильтрации столкновений. При изменении типа тела динамическое тело может неожиданно начать или перестать сталкиваться с другими объектами. Для контроля столкновений можно использовать:
body.setCollisionGroup(1); // группа столкновений
body.setCollisionMask(0xFFFF); // маска столкновений
Это особенно важно, когда статическое тело превращается в динамическое в середине симуляции — без корректной настройки масок возможно «проваливание» через другие объекты.
Изменение типа тела в Oimo.js — мощный инструмент для гибкого управления симуляцией, позволяющий комбинировать физическое поведение и ручное управление объектами без создания лишних объектов или сложной логики.