Oimo.js — это высокопроизводительная физическая библиотека для моделирования твердых тел в браузере на JavaScript. Одной из ключевых задач при работе с физическим движком является отладка симуляции, особенно когда объекты переходят в состояние сна. Спящие тела (sleeping bodies) — это тела, которые временно исключаются из расчета физики для повышения производительности, но их состояние может влиять на взаимодействие сцены.
Каждое тело в Oimo.js имеет несколько флагов и свойств, определяющих его активность:
isSleeping — булевое свойство, показывающее, находится
ли тело в состоянии сна.sleepTime — время, в течение которого тело оставалось
неподвижным.wakeUp() — метод для пробуждения тела, переводящего его
в активное состояние.sleep() — метод, позволяющий принудительно перевести
тело в спящее состояние.Спящие тела не участвуют в расчете столкновений до тех пор, пока не активируются внешним воздействием. Для визуальной отладки важно выделять их особым образом, чтобы видеть, какие объекты отключены от симуляции.
Для отображения спящих тел часто используют изменение цвета, прозрачности или добавление вспомогательных рамок:
for (let i = 0; i < world.bodies.length; i++) {
const body = world.bodies[i];
if (body.isSleeping) {
// Рисуем спящее тело красным цветом
drawBody(body, 0xff0000);
} else {
// Активное тело отображаем обычным цветом
drawBody(body, 0x00ff00);
}
}
Функция drawBody может быть реализована через WebGL,
Three.js или Canvas2D, в зависимости от визуализации. Ключевой момент —
отдельная обработка состояний тела, чтобы сразу
отличать активные объекты от спящих.
Oimo.js позволяет настраивать параметры сна для тел:
allowSleep — разрешение тела входить в состояние сна
(по умолчанию true).sleepLinearVelocity — порог линейной скорости для
перехода в сон.sleepAngularVelocity — порог угловой скорости.sleepTimeLimit — минимальное время покоя перед
переходом в спящее состояние.Пример настройки:
const box = world.add({
type: 'box',
size: [1, 1, 1],
pos: [0, 5, 0],
move: true,
allowSleep: true,
sleepLinearVelocity: 0.05,
sleepAngularVelocity: 0.05,
sleepTimeLimit: 1.0
});
Правильная настройка этих параметров позволяет избегать преждевременного сна активных объектов и снижает нагрузку на движок, не нарушая реализм симуляции.
console.log(body.isSleeping, body.sleepTime) для анализа
динамики сна в реальном времени.Спящие тела не участвуют в коллизиях, но внешнее воздействие может их
разбудить. Например, при столкновении активного тела с телом в состоянии
сна, Oimo.js автоматически вызывает wakeUp() для спящего
объекта. Для отладки важно наблюдать момент
пробуждения, чтобы убедиться, что симуляция работает корректно
и нет “зависших” объектов.
Для более комплексных проектов удобно создавать отдельный слой для отладки, на котором отображаются только спящие тела с визуальными метками их времени сна и скоростью. Это позволяет одновременно видеть активные физические процессы и объекты в состоянии покоя, без влияния на игровую или анимационную сцену.
Хотите, я могу подготовить пример готового отладочного скрипта на Oimo.js с отображением всех состояний тел в 3D-сцене?