Библиотека Oimo.js реализует физический движок на
основе метода rigid body dynamics, где расчёт движения
объектов зависит от итеративных процедур решения уравнений движения и
ограничений. Одним из ключевых параметров управления точностью симуляции
является numVelocityIterations.
numVelocityIterations задаёт количество итераций,
которые движок выполняет для корректировки скоростей
тел в процессе разрешения ограничений, таких как столкновения и
соединения. В физическом движке каждая итерация улучшает точность
вычисления скоростей и, как следствие, уменьшает просачивание тел через
друг друга и повышает стабильность симуляции.
integer)При симуляции кадр делится на несколько этапов:
Именно на втором этапе задействуется
numVelocityIterations. Каждая итерация проходит по всем
контактам и соединениям, корректируя скорости так, чтобы:
Увеличение числа итераций повышает точность решения, но напрямую влияет на производительность.
Малое значение (1–3):
Среднее значение (4–8):
Высокое значение (9–20+):
numPositionIterations следует соблюдать
баланс: слишком высокая точность скоростей без достаточных итераций для
позиций может привести к нестабильности.const world = new OIMO.World({
timestep: 1/60,
iterations: 8, // общее число итераций
broadphase: 2, // тип broadphase
worldscale: 1,
random: true,
});
// При создании тела можно явно указать numVelocityIterations
const box = world.add({
type: "box",
size: [1, 1, 1],
pos: [0, 10, 0],
move: true,
density: 1,
friction: 0.4,
restitution: 0.1,
numVelocityIterations: 12
});
В этом примере тело box будет обрабатываться с
повышенной точностью расчёта скоростей, что важно для предотвращения
ошибок при столкновениях с другими объектами.
numPositionIterations – управляет
точностью корректировки позиций.timestep – размер шага симуляции:
меньший шаг позволяет использовать меньше итераций без потери
точности.friction и restitution –
параметры материала: при высоких значениях трения или упругости стоит
увеличить numVelocityIterations, чтобы уменьшить
проскакивание и проскальзывание.Использование numVelocityIterations является критическим
для создания реалистичной симуляции в Oimo.js. Правильная настройка
позволяет достичь баланса между стабильностью,
точностью и производительностью,
особенно в сценах с большим числом динамических объектов или сложными
механическими соединениями.