В физическом движке дискретная проверка столкновений выполняется в фиксированные моменты времени — на каждом шаге симуляции. Если объект за один шаг перемещается на значительное расстояние, возможна ситуация «туннелирования», при которой быстро движущееся тело проходит сквозь другое без фиксации контакта. Непрерывное обнаружение столкновений (CCD) решает эту проблему путём анализа движения тела в пределах временного интервала шага.
В библиотеке Oimo.js реализованы механизмы, позволяющие учитывать перемещение тел между кадрами и вычислять момент первого касания.
В дискретной модели:
Если объект переместился от точки A к точке B и за время шага полностью пересёк другое тело, пересечения в дискретных точках может не оказаться.
Основной недостаток — зависимость точности от величины
timeStep.
В CCD рассматривается траектория движения тела за интервал времени
dt. Проверяется не только конечное положение, но и весь
путь.
Ключевая идея — вычисление Time of Impact (TOI) — момента времени внутри шага, когда происходит первое касание.
TOI — это параметр t ∈ [0, 1], отражающий долю шага
симуляции, на которой тела впервые соприкасаются.
Алгоритм включает:
Представление движения тела как линейной интерполяции:
position(t) = p0 + v * tФормирование “swept volume” — объёма, охватывающего движение.
Поиск минимального t, при котором расстояние между
телами становится равным нулю (или меньше допустимого порога).
В Oimo.js используется упрощённая модель CCD, ориентированная на линейное движение, без полноценной обработки сложных вращательных сценариев.
Для упрощённых форм (сфера, AABB) можно аналитически вычислить пересечение вдоль траектории.
Метод быстрый, но ограничен типами геометрии.
Алгоритм постепенно «продвигает» объект вперёд во времени:
Преимущества:
Недостатки:
В Oimo.js система столкновений состоит из двух этапов:
CCD частично влияет на Broad Phase, поскольку AABB расширяется с учётом движения (swept AABB).
При включённом CCD используется:
CCD критически важна в следующих случаях:
timeStep недоступен из-за
производительности.Если скорость объекта превышает его размер за один шаг:
velocity * dt > objectSize
риск туннелирования резко возрастает.
Непрерывная проверка преимущественно учитывает линейное движение. Быстрое вращение тонких объектов может привести к неточностям.
CCD требует:
В сложных сценах с большим количеством динамических тел нагрузка возрастает экспоненциально.
Возможны:
Поэтому вводятся:
Для сложных мешей CCD часто не применяется напрямую. Используются:
В конфигурации тела можно задавать:
Практическая стратегия:
timeStep;Уменьшение timeStep снижает вероятность туннелирования,
но:
CCD позволяет сохранить разумный timeStep, обеспечивая
при этом корректную обработку столкновений.
Оптимальная конфигурация:
После определения TOI:
Такой процесс может повторяться несколько раз за один кадр, что влияет на стабильность и производительность.
Без CCD объект проходит сквозь цель. С CCD вычисляется точный момент столкновения.
Если толщина объекта меньше возможного перемещения за шаг, дискретная проверка не гарантирует обнаружения касания поверхности.
CCD предотвращает проникновение в плоскость.
Непрерывное обнаружение столкновений — компромисс между:
В интерактивных приложениях, веб-играх и визуализациях на базе Oimo.js целесообразно применять гибридный подход:
Грамотная настройка параметров позволяет минимизировать туннелирование без чрезмерного увеличения нагрузки на процессор.