Zdarzenie Unity dotyczące kolizji daje ci obiekt kolizji, który daje pewne informacje na temat kolizji, która miała miejsce (w tym listę punktów kontaktowych z normalnymi trafieniami).
Ale nie dostajesz normalnych powierzchni dla zderzacza, który trafiłeś. Oto zrzut ekranu do zilustrowania. Czerwona linia pochodzi z, ContactPoint.normal
a niebieska linia pochodzi z RaycastHit.normal
.
Czy jest to przykład ukrywania informacji w Unity w celu zapewnienia uproszczonego interfejsu API? A może standardowe techniki wykrywania kolizji w czasie rzeczywistym 3D po prostu nie zbierają tych informacji?
A jeśli chodzi o drugą część pytania, jaki jest pewny i stosunkowo skuteczny sposób na uzyskanie normalnej powierzchni na wypadek kolizji?
Wiem, że raycasting daje ci normalne na powierzchni, ale wydaje się, że muszę zrobić kilka raycastów, aby osiągnąć to we wszystkich scenariuszach (może punkt kontaktowy / normalna kombinacja nie trafia w zderzacz przy pierwszym rzucie, a może musisz zrobić jakąś średnią ze wszystkich normalne punkty kontaktowe, aby uzyskać najlepszy wynik).
Moja obecna metoda:
Wykonaj kopię zapasową
Collision.contacts[0].point
wzdłuż jej normalnego poziomuRaycast w dół zanegowane trafienie normalne
float.MaxValue
, naCollision.collider
Jeśli to się nie powiedzie, powtórz kroki 1 i 2 z niez negowanym normalnym
Jeśli to się nie powiedzie, spróbuj wykonać kroki od 1 do 3 za pomocą
Collision.contacts[1]
Powtarzaj 4, aż się powiedzie lub do wyczerpania wszystkich punktów kontaktowych.
Poddaj się, wróć
Vector3.zero
.
Wydaje się, że to wszystko łapie, ale wszystkie te raycaste powodują, że mam mdłości i nie jestem pewien, jak sprawdzić, czy działa to w wystarczającej liczbie przypadków. Czy jest lepszy sposób?
EDYCJA Jeśli tak właśnie jest z kolizją 3D, przegląd tego, dlaczego w ogólnym przypadku byłby tak samo mile widziany, jak coś specyficznego dla Unity.