Jak obliczyć zwrot w kierunku pocisku?


14

Mam pocisk wystrzelony ze statku pod kątem, następnie pocisk obraca się w kierunku celu łukiem o danym promieniu skrętu. Jak określić punkt na łuku, kiedy muszę zacząć skręcać, aby pocisk zmierzał prosto w cel?

EDYTOWAĆ

To, co muszę zrobić, zanim wystrzelę pociski, to obliczyć i narysować ścieżki lotu. Tak więc w załączonym przykładzie pojazd nośny ma kąt 90 stopni, a cele są za nim. Oba pociski wystrzeliwane są w kierunku względnym wynoszącym -45 stopni lub + 45 stopni w stosunku do kierunku wystrzeliwania pojazdu. Pociski początkowo obracają się w kierunku celu o znanym promieniu skrętu. Muszę obliczyć punkt, w którym zwrot zabiera pocisk w kierunku, w którym obróci się, aby bezpośrednio zaatakować cel. Oczywiście, jeśli cel jest pod kątem 45 stopni lub mniej, wtedy nie ma początkowego obrotu pocisk po prostu leci prosto do celu.

Po wystrzeleniu pocisku mapa pokaże również śledzenie pocisku na tej linii jako wskazanie toru lotu.

Pracuję nad symulatorem, który naśladuje oprogramowanie operacyjne. Muszę więc narysować obliczoną trasę lotu, zanim pozwolę na wystrzelenie pocisku.

Two missiles aimed at two targets

W tym przykładzie cele znajdują się za pojazdem startowym, ale wytyczono wstępnie obliczone ścieżki.


1
Czy kurs jest wstępnie obliczany, czy zmienia się podczas trajektorii? (jak rakieta naprowadzająca?)
Jonathan Connell,

1
Czy nie byłoby tak, gdy (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, gdzie (x1, y1) oznacza aktualną pozycję pocisku, a (x2, y2) jest celem?
Kaczka komunistyczna

Może powinieneś narysować to, co chcesz.
aaaaaaaaaaaa

3
Czy to problem 2D lub 3D?
Steve H.

Jeśli szukasz czegoś w rodzaju pocisku samonaprowadzającego, możesz to zrobić bez użycia trygonometrii. Zobacz to pytanie
BlueRaja - Danny Pflughoeft

Odpowiedzi:


9

Moja matematyka może być nieco niepoprawna, więc opublikowałem odpowiedź na wiki.

Zakładam, że chcesz zrobić scenariusz ciągłego naprowadzania - w którym pocisk P1 poruszający się z prędkością V1 nieustannie próbuje obrócić się w kierunku gracza P2; ale przy ograniczonym tempie zwrotu.

  1. Określ wektor między graczem a pociskiem.

    V2 = P2 - P1
  2. Zamień je w wektory jednostkowe.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Określ kąt między wektorami.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Ogranicz wartość kąta między nimi (pamiętaj, że twoje funkcje wyzwalania prawdopodobnie działają z radianami, więc spróbuj 0.1 jako szybkość skrętu).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Utwórz nowy wektor ruchu.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

EDYCJA: Nie ma „punktu wyjścia”, ponieważ jest bardziej niezawodna (i jest łatwiejsza w implementacji) dla scenariusza ciągłego bazowania. Nie musisz znaleźć punktu wyjścia dla koła - po prostu ogranicz szybkość, z jaką pocisk może zmienić kierunek, a reszta dzieje się z powodu ducha w maszynie.


1
Mmm ... jeśli pamięć służy, myślę, że musisz zrobić krzyżowy produkt, aby uzyskać kierunek kąta. Jeśli zrobisz iloczyn punktowy, poznasz wielkość kąta, ale nie kierunek (ponieważ produkty kropkowe mogą mieć V3 * V4 = V4 * V3, wydaje się, że nie ma sposobu, aby zauważyć różnicę orientacji). Zrób iloczyn skalarny, a następnie iloczyn krzyżowy - sprawdzając znak współrzędnej Z - aby znaleźć orientację.
ChrisE

@ChrisE Przykład jest w 2D (patrząc na 5.), więc oryginalna orientacja i wielkość kąta powinny być wystarczające.
Keeblebrox

Obliczanie kąta pomiędzy jest poprawne, ale nie jestem pewien, jaki jest twój zamierzony cel w kroku 5 LUB to, co powoduje. Czy krok 5 zakłada dodanie kąta a do v3, ponieważ nie rozumiem matematyki.
dlots

@dlots krok 5 ma dodać nowy „ograniczony kąt skrętu” do bieżącego wektora ruchu - w zasadzie zmienia on kierunek pocisku.
Jonathan Dickinson

Co jest SIGNw kroku 4?
Daniel Kaplan

2

Zakładam, że chcesz zmienić kierunek, zmieniając kurs startowy na kurs docelowy, a następnie idź prosto do celu (fajniejszym problemem powinno być trafienie w cel podczas skręcania!).

Muszę założyć, że jesteś w stanie skręcić z tym samym promieniem skrętu we wszystkich kierunkach (jest to uproszczenie, które trudno dostrzec w prawdziwych pociskach).

Najprostszym rozwiązaniem jest użycie gięcia pod kątem 90 ° : pilniki rakietowe, dopóki ich trajektoria nie utworzy kąta prostego z celem. jeśli skręcisz dokładnie w punkcie 90 °, ominiesz cel dokładnie o promień skrętu, ponieważ musisz wziąć pod uwagę sam zwrot. Rozwiązaniem jest zacząć obracać dokładnie o „promień skrętu” (?) Przed osiągnięciem punktu 90 °, a następnie skręcić tworząc łuk (spróbuj zgadnąć) 90 °, aby przejść prosto do celu.

To rozwiązanie nie zawsze jest wykonalne, na przykład gdy nie masz widoczności na ścieżce 90 ° (budynki lub inne przeszkody).

Dobrą wiadomością jest to, że rozwiązanie działa pod każdym kątem (nie tylko mitycznym 90 °). Sztuką jest uwzględnienie przestrzeni potrzebnej do skrętu przed rozpoczęciem skrętu.

Ile wcześniej? Dlatego 90 ° to najprostsze rozwiązanie ...

Powiedzmy, że osiągasz widoczność lub najlepszy cel, gdy ścieżka ostrzału tworzy kąt θ °, to powinieneś przewidzieć zwrot przez:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... gdzie secant jest odwrotnością cosinusa. Dowód jest trywialny i pozostawiony czytelnikowi.

Poważnie, formuła pochodzi z prostej geometrycznej konstrukcji.

Wykres punktu zwrotnego

Czarna linia to ścieżka ognia, podczas gdy cienka czarna linia to ta sama ścieżka, którą przesuwa się w kierunku celu, obracając jednostki radiacji; to samo dotyczy czerwonych, które są ścieżką docelową.

Zielone segmenty zmieniają się w promień, więc powinieneś zobaczyć, że:

AB jest styczną 90 ° - θ °

BC jest siecznym.

Obie zielone linie wychodzące z punktu zwrotnego mają promień skrętu i są prostopadłe do dwóch ścieżek; co oznacza, że ​​promień skrętu jest prawidłowy, a łuk jest styczny do obu ścieżek (tak jak powinno być, jeśli wykonujesz zakręt w ograniczeniach fizycznych).

Daj mi znać, jeśli zobaczysz jakiś błąd.

EDYTOWAĆ:

Opublikowany rysunek pokazuje, że istnieje wiele możliwości wyboru ścieżki nawet w przypadku stałej strzelanki i celu, jak widać tutaj:

wprowadź opis zdjęcia tutaj

Po wybraniu celu możesz zastosować to, co powiedziałem powyżej, pod odpowiednim kątem.


Należy pamiętać, że nie jest to system ciągłej aktualizacji. Ponieważ bazowanie wymaga więcej procesora (dużo), należy rozważyć właściwe podejście do ustalonych celów lub, jeśli ktoś chce wdrożyć pocisk „półgłupi”. Trajektorię można po prostu sparametryzować poprzez podzielenie ścieżki na 3 podścieżki, a łuk można aproksymować krzywą Beziera.
FxIII

1

Wprowadziłbym „zachowanie kierownicze” dla pocisku. Pocisk ma: prędkość (liczbę), pozycję (wektor) i obrót (prąd). Przy każdej aktualizacji w grze / w każdej klatce obrót pocisku zmienia się tylko nieznacznie (w kierunku celu). Następnie pocisk jest przesuwany do przodu zgodnie z jego bieżącym obrotem i aktualną prędkością.

Działa oczywiście w 2D i 3D, ponieważ jedyną różnicą jest dodatkowy wymiar.

Inną możliwością byłoby obliczenie ścieżki pocisku przed wystrzeleniem go. Wyszukaj krzywe Beziera lub splajn .


Problem z użyciem tutaj splajnu polega na tym, że jeśli cel się poruszy, będziesz musiał ciągle aktualizować punkty kontrolne. Prosty sposób sterowania może być tańszy pod względem obliczeniowym.
ChrisE

Właściwie próbuję wstępnie obliczyć ścieżkę do celu. To, co pracuję, to symulator prawdziwego sprzętu i staram się naśladować jego zachowanie.
Tony

0

Mam wrażenie, że rozwiązujesz tutaj zły problem. Pocisk w prawdziwym świecie nie będzie się martwił, dokąd się skręcić, po prostu skręci, dopóki nie wyceluje w swój cel. Jedynym wymaganym obliczeniem jest, kiedy należy przywrócić kontrolę do położenia neutralnego, ponieważ pocisk w prawdziwym świecie nie może natychmiast zmienić swojego wskaźnika obrotu. Obliczenia te przyjmą jedynie wskazaną prędkość pocisku jako wartość wejściową i sądzę, że byłby wstępnie obliczony.


2
Pocisk z prawdziwego świata, zwłaszcza późniejsze bronie, mają inercyjne systemy naprowadzające lub GPS lub oba w nich, więc są zaprogramowane, aby przejść do obszaru poszukiwań i zacząć szukać celu. Biada, jeśli przyjaciel jest w pobliżu. Programowanie ma umożliwić wysłanie pocisku na ścieżkę, która omija towarzyskie i inne przeszkody, takie jak lądowanie i niewinne osoby postronne.
Tony

0

Myślę, że najprostszy algorytm zastosowałby dwie zasady:

  1. Jeśli aktualny cel znajduje się bliżej pocisku niż średnica zawracania, idź prosto. Pozwala to uniknąć pocisków krążących wokół bliskich celów zamiast do nich docierać.

  2. W przeciwnym razie obróć się w kierunku celu, aż wskażesz go.

Aby obliczyć punkt, w którym zakręt kończy się w 2D:

  1. W punkcie, w którym chcesz rozpocząć skręcanie, środek koła skrętu znajduje się w kierunku prostopadłym do bieżącego kursu w odległości od promienia skrętu. Zauważ, że są dwa z tych punktów - prawdopodobnie chcesz mieć najbliższy cel. Oblicz tę pozycję i nazwij ją P.

  2. Możesz teraz zbudować trójkąt prostokątny z kątem prostym w stycznej i dwoma znanymi punktami - P i miejscem docelowym. Pozwala to obliczyć odległość od stycznej do punktu docelowego za pomocą Pitagorasa. Nazwij to D.

  3. Teraz musisz obliczyć przecięcie koła o promieniu D w miejscu docelowym z promieniem skrętu. Otrzymasz dwa rozwiązania, które są dwoma stycznymi punktami na tym okręgu, w których pocisk przestałby się obracać (po jednym dla każdego kierunku ruchu wokół koła). Wybierz punkt znajdujący się przed pociskiem - oto twoja odpowiedź.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.