Класс DebugDraw предназначен для визуализации физической сцены в библиотеке Oimo.js. Он обеспечивает отладочную прорисовку объектов, соединений и столкновений, что позволяет наблюдать внутренние процессы симуляции без необходимости создавать полноценный рендеринг с использованием сторонних графических движков.
DebugDraw не влияет на физику сцены, его задача исключительно визуальная.
<canvas> или WebGL.Для работы с DebugDraw необходим доступ к объекту мира OIMO.World. Экземпляр создается с указанием контекста рисования:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const debugDraw = new OIMO.DebugDraw(ctx);
Параметры конструктора:
context — объект контекста Canvas или WebGL, куда будут
отрисовываться объекты.scale — коэффициент масштабирования координат (по
умолчанию 1).color — базовый цвет отрисовки объектов, может быть
переопределен на уровне отдельных тел.1. Привязка к миру
После создания экземпляра DebugDraw необходимо привязать его к физическому миру:
debugDraw.setWorld(world);
Где world — экземпляр OIMO.World.
Привязка позволяет DebugDraw автоматически получать
список тел и столкновений.
2. Отрисовка сцены
Метод draw() выполняет полный проход по всем телам и
контактам сцены:
debugDraw.draw();
Внутри draw() происходит:
RigidBody;3. Настройка цвета и прозрачности
Для выделения разных тел применяются методы:
debugDraw.setColor(body, color);
debugDraw.setAlpha(body, alpha);
body — экземпляр RigidBody;color — строка цвета ("#ff0000" или
"rgba(255,0,0,0.5)");alpha — уровень прозрачности (0.0–1.0).Это позволяет визуально различать динамические, статические и кинематические объекты.
4. Визуализация контактных точек
DebugDraw может показывать точки контакта между телами. Для этого используется метод:
debugDraw.drawContacts();
Визуализируются:
Цвет и размер контактов можно настраивать отдельно для упрощения анализа столкновений.
Для динамического обновления сцены DebugDraw должен вызываться после шага физического мира:
function animate() {
world.step();
ctx.clearRect(0, 0, canvas.width, canvas.height);
debugDraw.draw();
requestAnimationFrame(animate);
}
animate();
Порядок вызовов важен: сначала шаг физики, затем очистка холста, после чего отрисовка всех объектов через DebugDraw.
DebugDraw автоматически определяет форму тела и использует соответствующий метод визуализации:
Для каждого типа реализованы внутренние методы:
_debugDrawBox(body);
_debugDrawSphere(body);
_debugDrawCylinder(body);
_debugDrawCone(body);
Эти методы учитывают позицию, ориентацию и масштаб тела.
Можно расширять класс DebugDraw для создания уникальных визуальных эффектов:
Пример добавления подсветки при столкновении:
world.bodies.forEach(body => {
if(body.contacts.length > 0) {
debugDraw.setColor(body, "#ff0000");
}
});
debugDraw.draw();
Класс DebugDraw является мощным инструментом для понимания поведения физических тел в Oimo.js, предоставляя полный контроль над визуальной диагностикой сцены и взаимодействиями между объектами.