В Oimo.js объект Shape представляет собой геометрическую
форму, привязанную к телу (Body). Shape
определяет форму коллизии и физические свойства объекта, такие как
масса, трение и упругость. Каждое тело может содержать несколько форм,
что позволяет создавать сложные составные объекты.
Создание Shape осуществляется через конструктор,
передавая параметры геометрии и физические свойства:
const shape = new OIMO.Shape({
type: 'box',
size: [1, 2, 1],
pos: [0, 1, 0],
rot: [0, 0, 0],
density: 1,
friction: 0.5,
restitution: 0.2
});
'box',
'sphere', 'cylinder', 'capsule' и
т.д.'box' это
[width, height, depth].После создания форму нужно привязать к телу:
body.addShape(shape);
Добавление новых форм к телу позволяет расширять его коллизионные свойства без пересоздания всего объекта. Например, можно добавить вспомогательную форму для точного контроля столкновений:
const extraShape = new OIMO.Shape({
type: 'sphere',
size: [0.5],
pos: [0, 1.5, 0],
density: 0.5
});
body.addShape(extraShape);
При добавлении формы важно учитывать:
pos задают локальную позицию формы.Удаление формы используется для динамического изменения коллизионной геометрии во время работы симуляции. Метод удаления:
body.removeShape(shape);
После удаления формы необходимо учитывать:
Shape остаётся
доступным в памяти, если на него есть ссылки.Для полного уничтожения формы следует освободить все ссылки:
shape = null;
Каждое тело хранит список своих форм в массиве
body.shapes. Это позволяет выполнять итерацию, выборочные
модификации или удаление форм по условию:
body.shapes.forEach((s, index) => {
if (s.type === 'sphere') {
body.removeShape(s);
}
});
Oimo.js не поддерживает прямое изменение размера или типа существующей формы. Для модификации требуется:
body.removeShape().body.addShape().Пример изменения куба на сферу:
const oldShape = body.shapes[0];
body.removeShape(oldShape);
const newShape = new OIMO.Shape({
type: 'sphere',
size: [1],
pos: oldShape.position,
density: oldShape.density
});
body.addShape(newShape);
Добавление и удаление форм во время симуляции:
С помощью нескольких форм можно создавать сложные коллизионные объекты:
Пример составного тела:
const body = new OIMO.Body({
type: 'dynamic',
pos: [0, 2, 0]
});
body.addShape(new OIMO.Shape({ type: 'box', size: [1, 1, 1] }));
body.addShape(new OIMO.Shape({ type: 'cylinder', size: [0.5, 2], pos: [0, 1, 0] }));
Это позволяет точно контролировать коллизию и поведение физического объекта.
Эти методы обеспечивают гибкое управление геометрией объектов в Oimo.js, позволяя создавать как статические, так и динамические составные тела с возможностью добавления и удаления форм в процессе симуляции.