Коллизии: невидимый скелет уровня

6 сен 2026 · 7 мин · 💬 1

Видимый меш существует для игрока. Коллизионный — для физики. И если первый украшают, второй упрощают до аскезы. Я начинал с того, что скармливал движку визуальную геометрию целиком — 80 тысяч треугольников на одну лестницу — и узнал на своих граблях, чего так не делают.

Зачем коллизия проще меша

Физический движок на каждом кадре отвечает на вопросы: «где поверхность», «что с чем столкнулось». Стоимость растёт с числом треугольников: broad phase отбрасывает лишнее, но narrow phase обязан перебрать кандидата по рёбрам и вершинам. Визуальный меш с нормаль-картами, фасками и износом содержит тысячи треугольников, которые ничего не дают физике — скругление в 2 мм игрок не почувствует, но процессор его посчитает.

Правило большого пальца: коллизия должна быть в 10–50 раз легче визуала. Ощущение контакта определяется формой на уровне пальцев и стопы, а не фаской на перилах.

Примитивы: box, sphere, capsule

Дешевле выпуклой оболочки только конвейерная обработка примитивов. Стена — это box, а не меш из 12 треугольников с UV. Капсула игрока — capsule, шарик — sphere. В Unreal примитивы задаются прямо в редакторе: в Static Mesh Editor у любого статического меша есть Simple Collision — набор боксов, сфер и капсул, из которых собирается коллизия (исторически для этих же целей служила Brush-геометрия BSP, но из Unreal её выпилили ещё в 4.25). В Unity — через Box Collider / Capsule Collider на пустых объектах. Мой выбор для прямых поверхностей — всегда примитивы: это самый быстрый путь физики и нулевая погрешность формы.

Выпуклые оболочки: UCX

Для сложной формы (стол со скосами, бочка, камень) — выпуклая оболочка: минимальный выпуклый меш, «яичная скорлупа» вокруг объекта. В Unreal это UCX-меши: копеечная магия именования — UCX_стол_01, тот же префикс, что у визуального меша, в той же папке, и движок сам их связывает. Ограничение железное: выпуклая оболочка не может иметь вогнутостей. Стол с углублением внутри столешницы? Углубления не будет — физика прокатится по «натянутой плёнке». Для таких случаев — несколько UCX-кусков вместо одного или convex decomposition (Auto Convex Collision в Unreal делает её сам, но вручную выходит чище).

Mesh collision: последний аргумент

Требушетная коллизия (точная копия меша) нужна редко: сложный рельеф, трасса в гонках. Стоит дорого, считается медленно. Если mesh collision просит статический проп — я отказываю и режу на выпуклые куски.

Цены ошибок

  • Проваливание сквозь пол. Зазор между коллизией и визуалом больше 1–2 см. Лечится тем, что коллизия чуть толще визуала на величину допустимого проникновения — те же 1–2 см, не меньше.
  • Залипание на стыках. Две соседние UCX-коробки с микроскопическим зазором — персонаж спотыкается о невидимый бордюр. Решение: перекрывать стыки на несколько миллиметров, а не ставить вплотную.
  • Ступеньки-убийцы. Порог выше ~35 см игрок не перешагнёт (step offset контроллера). Проектировать уровень под коллизию, а не наоборот.
  • FPS-яма из-за выпуклой декомпозиции на весь уровень. 300 UCX-оболочек в одной комнате — это не оптимизация. Считать количество, а не только треугольники.

Чек-лист перед сдачей

  • [ ] ни одна UCX не имеет вогнутостей (выпуклость проверяется визуально: натянутая плёнка)
  • [ ] стыки перекрываются, зазоров нет
  • [ ] коллизия толще визуала на 1–2 см там, где ходит игрок
  • [ ] имена префиксов правильные, движок их подхватил (проверить в режиме коллизий, не на глаз)
  • [ ] суммарное число коллайдеров уровня посчитано

Хорошую коллизию не видно. Именно поэтому её делают в первую очередь, а не «как-нибудь потом».

Комментарии (1)

Форма для гостей комментариев пока не принимается — писать можно автору (expeot@outlook.com) или через владельца блога. Все записи выше настоящие, никто их не модерирует молча.