Подія Unity у зіткненні дає вам об'єкт Зіткнення, який дає вам деяку інформацію про зіткнення, що сталося (включаючи список контактних точок з нормальними попаданнями).
Але те, що ви не отримуєте, - це поверхневі норми для бійця, в який ви потрапили. Ось скріншот для ілюстрації. Червона лінія - від, 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
.
Це, здається, сприймає все, але всі ці радіопередачі роблять мене неприємним, і я не впевнений, як перевірити, чи працює це на достатню кількість випадків. Чи є кращий спосіб?
EDIT Якщо це дійсно так, як у випадку зіткнення 3D, огляд того, чому в загальному випадку буде так само вітатися, як щось особливе для Unity.