Кинематические тела: управление через скорость

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

В Oimo.js кинематическое тело создаётся с помощью свойства type: "kinematic" при добавлении тела в мир:

const box = world.add({
    type: "kinematic",
    size: [2, 2, 2],
    pos: [0, 5, 0]
});

Ключевые особенности кинематических тел:

  • Не реагируют на силы и импульсы, но могут воздействовать на динамические тела при столкновениях.
  • Могут перемещаться исключительно за счёт изменения позиции или линейной/угловой скорости.
  • Позволяют точно контролировать движение объектов по заранее определённым траекториям.

Управление линейной скоростью

Линейная скорость задаётся через метод linearVelocity, который принимает вектор скорости [x, y, z]:

box.linearVelocity = [0, 5, 0]; // движение вверх с постоянной скоростью

При этом важно помнить, что кинематическое тело не ускоряется под действием силы; скорость задаётся напрямую и сохраняется до следующего обновления. Для плавного движения необходимо обновлять скорость на каждом шаге симуляции, если требуется изменение направления или величины.

Пример движения по оси X

let speed = 2;
function update() {
    box.linearVelocity = [speed, 0, 0]; // движение вправо
    world.step();
}

Если требуется остановка, достаточно присвоить нулевой вектор:

box.linearVelocity = [0, 0, 0];

Управление угловой скоростью

Угловая скорость задаётся через свойство angularVelocity, которое также принимает вектор [x, y, z], определяющий скорость вращения вокруг каждой оси:

box.angularVelocity = [0, 1, 0]; // вращение вокруг оси Y

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


Позиционирование кинематических тел

Позицию можно задавать напрямую через свойство position, что удобно для мгновенного перемещения объекта без промежуточного движения:

box.position = [10, 5, 0];

Использование position обычно предпочтительно для тел, которые должны «телепортироваться» или следовать за заранее определённой траекторией. Однако для плавного движения лучше применять линейную скорость, чтобы столкновения с динамическими телами рассчитывались корректно.


Практика комбинирования скоростей и позиции

Для создания сложных траекторий движения можно комбинировать linearVelocity, angularVelocity и прямое изменение позиции. Например, движение платформы с вращающимся элементом:

box.position = [Math.sin(time) * 5, 2, 0]; // движение по синусоиде
box.angularVelocity = [0, 2, 0]; // постоянное вращение

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


Взаимодействие с динамическими телами

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

const dynamicBox = world.add({
    type: "dynamic",
    size: [1, 1, 1],
    pos: [0, 6, 0]
});

box.linearVelocity = [1, 0, 0]; // движение платформы

Динамический куб будет перемещаться под действием столкновения с платформой. Важно контролировать скорость платформы, чтобы динамические тела не «проваливались» сквозь неё при слишком высокой скорости.


Советы по оптимизации

  • Избегать частого телепортирования через position больших объектов — лучше использовать linearVelocity для плавных движений.
  • Проверять столкновения при высоких скоростях, используя небольшие шаги симуляции (world.step(deltaTime)).
  • Для вращения сложных объектов учитывать момент инерции и синхронизацию с анимацией, чтобы движение выглядело естественно.

Итоговые свойства кинематических тел

Свойство Назначение
linearVelocity Линейная скорость движения [x, y, z]
angularVelocity Угловая скорость вращения [x, y, z]
position Положение тела в мире [x, y, z]
type: "kinematic" Тип тела, игнорирующий силы

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