Событие Unity по столкновению дает вам объект Collision, который дает вам некоторую информацию о произошедшем столкновении (включая список ContactPoints с нормалью попадания).
Но то, что вы не получаете, это поверхностные нормали для коллайдера, который вы ударили. Вот скриншот для иллюстрации. Красная линия от ContactPoint.normalи синяя линия от RaycastHit.normal.

Является ли это примером того, как Unity скрывает информацию для предоставления упрощенного API? Или стандартные трехмерные методы обнаружения столкновений в реальном времени просто не собирают эту информацию?
И для второй части вопроса, каков верный и относительно эффективный способ получить нормальную поверхность для столкновения?
Я знаю, что лучевое вещание дает вам поверхностные нормали, но мне кажется, что мне нужно сделать несколько лучевых вещаний, чтобы выполнить это для всех сценариев (возможно, комбинация точки контакта / нормального положения пропускает коллайдер в первом броске, или, возможно, вам нужно сделать какое-то среднее из всех нормали контактных точек, чтобы получить лучший результат).
Мой текущий метод:
Резервное копирование
Collision.contacts[0].pointвдоль его удара нормальноRaycast вниз отрицательный удар нормальный для
float.MaxValue, наCollision.colliderЕсли это не удается, повторите шаги 1 и 2 с неотрицательным нормальным
Если это не помогло, попробуйте шаги 1–3 с
Collision.contacts[1]Повторите 4 до успешного или пока все точки контакта не исчерпаны.
Сдавайся, возвращайся
Vector3.zero.
Кажется, это все ловит, но все эти радиопередачи вызывают у меня тошноту, и я не уверен, как проверить, что это работает для достаточного количества случаев. Есть ли способ лучше?
РЕДАКТИРОВАТЬ Если это действительно так, как обстоят дела с 3D-столкновением, обзор того, почему в общем случае будет так же приветствоваться, как что-то специфическое для Unity.
