Событие 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.