Библиотека Oimo.js предоставляет возможности для
физического моделирования в 3D-сценах на JavaScript, включая динамику
твердых тел, столкновения и реакции на силы. Одним из наиболее часто
используемых примитивов является сфера. В Oimo.js сфера
представляется объектом типа SphereGeometry, который
определяет как физические, так и геометрические свойства тела.
Для создания сферического тела используется конструктор, задающий его
физические параметры и геометрию. Сфера формируется с помощью объекта
OIMO.Body с телом типа SphereGeometry. Пример
базового создания:
const body = new OIMO.Body({
type: "sphere",
size: [radius], // радиус сферы
pos: [x, y, z], // начальная позиция в пространстве
move: true, // подвижное тело
density: 1 // плотность материала
});
Ключевые моменты:
type: "sphere" указывает на сферическую форму
тела.size: [radius] задаёт радиус сферы, в Oimo.js массив
используется для унификации с другими формами.pos определяет исходное положение в мире.move контролирует, является ли тело динамическим
(движущимся) или статическим.density влияет на массу тела: масса вычисляется как
произведение плотности на объём сферы.1. Радиус (radius) Основной параметр, определяющий размер сферы. Радиус используется не только для визуализации, но и для расчёта столкновений и физических свойств.
2. Масса и плотность Масса вычисляется по формуле:
[ m = r^3]
где ( ) — плотность (density), а ( r ) — радиус. Эта
формула используется внутренне в Oimo.js для динамических тел.
3. Позиция и ориентация Сфера в 3D-пространстве
определяется вектором позиции [x, y, z]. Поскольку сфера
симметрична, ориентация не влияет на форму, но важна для взаимодействия
с другими объектами.
4. Подвижность (move) Свойство
move: true делает тело динамическим. Для статических сфер,
которые служат платформами или препятствиями, move
устанавливается в false.
Сфера взаимодействует с другими телами через коллайдеры. В Oimo.js сфера автоматически получает коллайдер формы сферы, который оптимизирован для расчёта столкновений. Основные аспекты:
world.gravity.body.setMaterial({
friction: 0.5,
restitution: 0.7
});
friction — коэффициент трения при касании.restitution — коэффициент упругого отскока при
столкновении.Для изменения размера сферы после её создания используется метод
setScale:
body.setScale([newRadius]);
Все физические свойства автоматически пересчитываются с учётом нового радиуса, включая массу и моменты инерции.
Сферы часто используются для:
Oimo.js оптимизирован для работы с множеством сфер одновременно благодаря простоте коллайдера и симметрии объектов.
Oimo.js позволяет контролировать точность расчёта столкновений через
параметры iterations и timestep мира. Для
сфер, участвующих в быстрых движениях, рекомендуется уменьшать
timestep и увеличивать количество iterations,
чтобы избежать проскакивания тел через препятствия:
const world = new OIMO.World({
timestep: 1/120,
iterations: 8,
broadphase: 2, // выбор метода broadphase
});
Для визуализации в WebGL или Three.js создаётся отдельная геометрия, которая синхронизируется с физическим телом:
const geometry = new THREE.SphereGeometry(radius, 32, 32);
const mesh = new THREE.Mesh(geometry, material);
function update() {
mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());
}
Сфера физически управляется Oimo.js, а визуальная часть обновляется в каждом кадре.
move: true, для
статических — move: false.timestep и
iterations в мире.Сферы в Oimo.js остаются одним из самых простых и одновременно мощных инструментов для физического моделирования, обеспечивая баланс между производительностью и реалистичностью поведения тел.