Какая форма коллайдеров самая оптимальная для расчета столкновений в 3D?
Что проверяют
Понимаете ли вы, из чего складывается стоимость физики, и не сводите ли всё к «сфера самая быстрая». Следом обычно спрашивают, чем заменить MeshCollider на сложном объекте и почему у персонажа капсула.
Как отвечать
В Unity 3D-физика работает на PhysX, и расчёт идёт в две фазы. Широкая отбрасывает далёкие пары по ограничивающим объёмам (AABB), узкая считает точный контакт для оставшихся. Форма коллайдера влияет на узкую фазу.
Формы по цене, от дешёвой к дорогой:
SphereCollider: пересечение сводится к сравнению расстояния между центрами с суммой радиусов, поворот не важен;CapsuleCollider: сфера, протянутая вдоль отрезка, проверка через расстояние до отрезка. Стандарт для персонажей: округлое дно проходит мелкие неровности и ступеньки;BoxCollider: учитывается поворот, поэтому проверка сложнее, чем у сферы, но всё ещё дешёвая;MeshColliderсconvex: выпуклая оболочка не больше 255 треугольников, годится для динамических тел;- невыпуклый
MeshCollider: самый дорогой, наRigidbodyбезisKinematicне поддерживается. Его место в статичной геометрии уровня.
Отсюда ответ: самая дешёвая форма это сфера, а оптимальна та, что достаточно точно описывает объект простейшими примитивами. Сложный объект собирают из нескольких примитивов на дочерних объектах под одним Rigidbody (составной коллайдер).
Затем назовите то, что влияет сильнее формы: матрица столкновений слоёв в настройках Physics, чтобы лишние пары не проверялись вовсе; засыпание неподвижных тел; Fixed Timestep; режим Continuous только у быстрых объектов; запросы вроде Physics.OverlapSphereNonAlloc, которые пишут в заранее выделенный массив.
Где спотыкаются
Отвечают «сфера» и останавливаются. Сфера на ящике даст катящийся ящик, а точность тут важнее выигрыша в микросекундах.
Вешают MeshCollider на всё подряд, включая детализированные модели с тысячами треугольников.
Не знают про матрицу слоёв и ищут узкое место в форме коллайдеров, хотя тормозят тысячи ненужных пар в широкой фазе.