Кинематические тела в 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]; // движение вверх с постоянной скоростью
При этом важно помнить, что кинематическое тело не ускоряется под действием силы; скорость задаётся напрямую и сохраняется до следующего обновления. Для плавного движения необходимо обновлять скорость на каждом шаге симуляции, если требуется изменение направления или величины.
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" |
Тип тела, игнорирующий силы |
Использование этих инструментов позволяет точно управлять движением объектов, создавать интерактивные платформы и анимации, обеспечивая при этом корректное взаимодействие с динамическими элементами сцены.