Znalezienie prawidłowej prędkości dla AI, aby skręcić, aby osiągnąć cel

10

Mam statek, który płynie z maksymalną prędkością maxSpeedi może obracać rotationSpeedstopnie na sekundę. Statek zawsze porusza się w kierunku, w którym jest skierowany, co oznacza, że ​​im szybciej statek płynie, tym większy jest jego promień skrętu.

Znam swoją pozycję, rotację i pozycję celu.

Chciałbym dowiedzieć się, czy cel znajduje się w moim promieniu skrętu przy tej prędkości lub lepiej, jaka jest maksymalna prędkość, z jaką mogę podróżować, aby wykonać zwrot do celu bez ciągłego okrążenia go.

Czy istnieje skuteczny (ish) sposób, aby to zrobić?

Oto, co do tej pory myślę: ponieważ wiem, jak daleko podróżuję na krok i ile obracam na krok, mogę dowiedzieć się, gdzie będę w następnych dwóch klatkach. Moja obecna pozycja to p1, moja następna pozycja to p2, a następnie p3. Potrafię wziąć prostopadłe dwusieczne (p1, p2) i (p2, p3). Ich punkt przecięcia da mi środek koła. Następnie mogę sprawdzić, czy cel znajduje się w tym kręgu.

Nie jestem pewien, czy to zadziała w 3D (nie jestem pewien, jak obliczyć sferę na podstawie moich danych wejściowych). To rozwiązanie również nie pomaga zbytnio w znalezieniu właściwej prędkości do podróży, musiałbym spróbować kilka razy z różnymi prędkościami, aby znaleźć rozsądną prędkość.

Czy ktoś może rzucić nieco światła na lepsze rozwiązanie?

weichsem
źródło

Odpowiedzi:

17

Istnieją dwa sposoby, aby jednostka sterowana AI z ograniczoną prędkością obrotową i regulowaną prędkością ruchu mogła osiągnąć cel.

Po pierwsze, zastanówmy się nad wyzwaniem, które jest nam przedstawione, abyśmy mogli go lepiej zrozumieć:

wprowadź opis zdjęcia tutaj

Jeśli gracz porusza się i obraca ze stałą prędkością, starając się dotrzeć do celu znajdującego się po jego prawej lub lewej stronie, będzie krążył w kółko na zawsze, nigdy nie stając do celu. Dwa obszary, które gracz zakreśli, są zaznaczone na czerwono powyżej.

Okrągły obszar zaznaczony na czerwono można obliczyć w następujący sposób:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Powoduje to pozycję i promień czerwonych kółek. Możemy to wykorzystać do ustalenia, czy określony cel znajduje się poza zasięgiem jednostki kontrolowanej przez AI, jeśli nadal skręca w kierunku celu.

Aby dowiedzieć się, czy określony element znajduje się w jednym z kręgów, po prostu obliczamy odległość od jego środka:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Istnieją na to dwa możliwe rozwiązania:

1.

Zbuduj pewną odległość, aż cel znajdzie się poza okrągłym czerwonym obszarem, a następnie zawróć w podobny sposób. Jest to proste, pozwól jednostce poruszać się, dopóki czek nie zwróci, że cel nie znajduje się w tym kręgu. Następnie możesz się odwrócić.

wprowadź opis zdjęcia tutaj

Druga opcja wymaga nieco więcej pracy, aby obliczyć:

Rysujemy wyobrażoną linię między jednostką AI a celem. Używając kąta między nimi:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Teraz musisz wykonać następujące czynności, aby obliczyć prawidłową prędkość:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

wprowadź opis zdjęcia tutaj

Aby uruchomić go w przypadku 3D:

Znajdź płaszczyznę, na której znajdują się następujące trzy punkty:

  1. Punkt bramkowy.
  2. Pozycja jednostki AI w poprzedniej ramce.
  3. Bieżąca pozycja jednostki AI.

Możesz użyć tego samolotu, aby obliczyć prędkość w sposób 2D. Wystarczy przekonwertować kropki z ich wartości 3d na wartości 2d osadzone na wspólnej płaszczyźnie.

Możesz użyć tego:

Jak przekonwertować punkt 3D na płaszczyźnie na współrzędne UV?

AturSams
źródło
Doskonały! Dokładnie odpowiedź, na którą liczyłem! Dzięki za szczegółowe wyjaśnienia, myślę, że jestem w stanie dokonać ekstrapolacji na ten temat i użyć go w 3D.
weichsem
@weichsem Zaktualizowałem odpowiedź. Pomysł, który zasugerowałem, to znalezienie wspólnej wspólnej płaszczyzny 2d i użycie jej do obliczenia właściwej prędkości.
AturSams,