Poruszające się obiekty zderzające się podczas korzystania z nieprzypisanego unikania kolizji (sterowanie)

9

Mam problem z niewyrównanym unikaniem kolizji w przypadku, który moim zdaniem jest rzadki. Ustawiłem dwa obiekty tak, aby zbliżały się do siebie, ale z niewielkim przesunięciem, więc jeden z nich porusza się lekko w górę, a jeden z nich porusza się lekko w dół.

W moim niewyrównanym algorytmie sterowania unikaniem kolizji znajduję punkty na linii przedniej obiektu i linii przedniej drugiego obiektu, gdzie te dwie linie są najbliższe. Jeśli te najbliższe punkty znajdują się w odległości unikania kolizji, a odległość między nimi jest mniejsza niż dwa promienie sfer ograniczających dwa obiekty, obiekty powinny skierować się w odpowiednim kierunku.

Problem polega na tym, że w moim przypadku oblicza się, że najbliższe punkty na liniach znajdują się naprawdę daleko od rzeczywistego punktu kolizji. Jest tak, ponieważ dwie linie do przodu dla każdego obiektu oddalają się od siebie, gdy obiekty mijają. Problem polega na tym, że z tego powodu nie odbywa się sterowanie, a dwa obiekty częściowo się zderzają.

Zrzut ekranu linii do przodu obiektu.

Czy ktoś ma jakieś sugestie, jak poprawnie obliczyć punkt zderzenia? Być może w jakiś sposób biorąc pod uwagę wielkość dwóch obiektów?

James Bedford
źródło
Zwróć uwagę, że na zrzucie ekranu zielone, czerwone i niebieskie linie są tylko osiami świata 3D.
James Bedford,

Odpowiedzi:

6

To zdecydowanie najlepszy artykuł na temat wykrywania kolizji między piłkami.

Lekcje sali bilardowej: szybkie, dokładne wykrywanie kolizji między kołami lub sferami

Adam Harte
źródło
Wiem, jak wykonać test zderzenia kuli. Moim problemem jest próba znalezienia miejsca, w którym nastąpi taka kolizja w przyszłości. Dzięki.
James Bedford
@James ten artykuł rozwiąże twoje problemy. Spójrz na stronę 2 i możesz użyć arbitralnie wysokiej liczby dla „prędkości” na jednej ze swoich sfer, aby określić punkt zderzenia „w przyszłości”.
Tetrad
Ok - przepraszam, że tego nie sprawdziłem, wygląda całkiem nieźle! Będę musiał się z tobą skontaktować, gdy go przeczytam. Dzięki :)
James Bedford
1
Czy mogę wyjaśnić, że na stronie 2 w sekcji „Strzał z banku: kolizja między dwoma ruchomymi okręgami” oznacza to, że należy użyć różnicy między prędkością dwóch kół w algorytmie zamiast prędkości pierwszego koła? (Prędkość drugiego koła nie jest używana w stacjonarnej wersji algorytmu.) Ten bit nie był dla mnie tak jasny. Dzięki.
James Bedford
0

Nie chcesz znaleźć najbliższego punktu.

Chcesz znaleźć punkt na liniach, w którym odległość jest równa połączonym promieniom obu sfer.

AttackingHobo
źródło
Ach ... ok! Czy wiesz, jak mogę to rozwiązać matematycznie ...?
James Bedford
0

Jeśli dobrze rozumiem twoje pytanie, możesz po prostu użyć testu przecięcia Sfera vs Sfera, jak sugeruje AttackingHobo.

Matematyka przeprowadzania takiego testu jest następująca (popraw mnie, jeśli się mylę, minęło trochę czasu). Uwzględnia to również fakt, że każda sfera ma zmienną środek i promień.

Formuła sprawdzania wygląda mniej więcej tak:

distanceOfSpheres <= sumOfRadii^2

Masz przecięcie sfery z kulą. Jest to dość proste, zobaczmy, jak to wygląda w kodzie!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Ponownie myślę, że jest to poprawna odpowiedź, której możesz szukać. Jeśli ktoś wie, że to źle, popraw mnie, ponieważ minęło trochę czasu, odkąd zrobiłem tę matematykę.

joelretdev
źródło
Wiem, jak wykonać test zderzenia kuli. Moim problemem jest próba znalezienia miejsca, w którym nastąpi taka kolizja w przyszłości. Dzięki.
James Bedford
0

Ok, mam nadzieję, że to ma sens ... Pobierz wektory kul i oblicz ich punkt zderzenia, nazwij to p1. Znajdź kąt między 2 wektorami, nazwij to a1. Na linii 1/2 narysuj linię, która będzie dokładnie pośrodku w stopniach między dwoma wektorami. Potrzebujesz miejsca na tej linii, w którym sin (a1 / 2) = (promień 1 + promień 2) / 2. Jeśli ten obraz jest wizualizowany w mojej prawej głowie, to tutaj dochodzi do kolizji. Przepraszam, jeśli to źle ... jest późno.

Sam
źródło