Mam model 3D wieży, która obraca się wokół osi Y. Ta wieża ma działo, które znajduje się znacznie poza środkiem obiektu. Chcę, aby armata, a nie wieża, celowała w określony cel. Mogę jednak tylko obracać wieżę i dlatego nie wiem, jakie równanie muszę zastosować, aby osiągnąć cel.
Poniższy obraz ilustruje mój problem:
Jeśli mam cel „LookAt ()” na wieży, laser pochodzący z armaty całkowicie nie trafi w ten cel.
Jeśli byłby to całkowicie odgórny scenariusz, a armata była dokładnie równoległa do wieży, moja logika podpowiada mi, że fałszywy cel powinien znajdować się w pozycji, która jest równa rzeczywistemu celowi plus przesunięcie równe temu między wieżyczka i działo. Jednak w moim scenariuszu mój aparat jest ustawiony pod kątem 60º, a działo obraca się lekko.
Poniższy obraz ilustruje scenariusz:
Nie jestem do końca pewien, dlaczego, ale jeśli zastosuję to samo przesunięcie, wydaje się, że działa ono tylko podczas celowania na pewne odległości od wieży.
Czy moja logika jest wadliwa? Czy brakuje mi czegoś fundamentalnego?
Ostateczna edycja: rozwiązanie dostarczone przez najnowszą aktualizację @JohnHamilton rozwiązuje ten problem z doskonałą precyzją. Usunąłem teraz kod i obrazy, których użyłem do zilustrowania moich niepoprawnych implementacji.
źródło
Odpowiedzi:
Odpowiedź jest dość prosta, jeśli wykonasz matematykę. Masz ustaloną odległość Y i zmienną odległość X (patrz zdjęcie 1). Musisz znaleźć kąt między Z i X i jeszcze bardziej obrócić wieżę.
Krok 1 - Uzyskaj odległość między linią wieży (V) a linią dział (W), która ma wartość Y (jest stała, ale nie boli, aby ją obliczyć). Uzyskaj odległość od wieży do celu (czyli X).
Krok 2 - Podziel Y przez X, a następnie uzyskaj sinus hiperboliczny wartości
Krok 3 - Obróć wieżę jeszcze bardziej (wokół osi, która biegnie od góry do dołu, najprawdopodobniej w górę, ale tylko ty możesz poznać tę część).
Oczywiście w tym przypadku trzeba go obrócić przeciwnie do ruchu wskazówek zegara, więc może być konieczne dodanie minus przed zakrętem tam, jak w
-turnAngle
.Edytowałem niektóre części. Dzięki @ens za wskazanie różnicy odległości.
OP powiedział, że jego pistolet ma kąt, więc proszę, najpierw zdjęcie, wyjaśnienie później:
Wiemy już z poprzednich obliczeń, gdzie celować czerwoną linią zgodnie z niebieską linią. Celując najpierw w niebieską linię:
Jedyne obliczenie, które się tutaj różni, to obliczenie „X Prime” (X '), ponieważ kąt między działem a wieżą (kąt „a”) zmienił odległość między liniami.
Ta kolejna część jest konieczna WYŁĄCZNIE, jeśli wykonujesz broń modułową (tzn. Użytkownik może zmieniać broń na wieży, a różne działa mają różne kąty). Jeśli robisz to w edytorze, możesz już zobaczyć, jaki jest kąt strzału w zależności od wieży.
Istnieją dwie metody znajdowania kąta „a”, jedna to metoda transform.up:
Powyższa technika będzie obliczana w 3D, więc jeśli chcesz uzyskać wynik 2D, musisz pozbyć się osi Z (to jest to, co zakładam, gdzie jest grawitacja, ale jeśli nic nie zmieniłeś, w Unity to oś Y, która jest w górę lub w dół, tj. grawitacja znajduje się na osi Y, więc może być konieczna zmiana rzeczy):
Drugi sposób to metoda rotacji (w tym przypadku myślę w 2D):
Ponownie, wszystkie te kody podadzą ci wartości, które są dodatnie, więc być może będziesz musiał dodać lub odjąć kwotę w zależności od kąta (są też obliczenia, ale nie zamierzam zagłębiać się tak dokładnie). Dobrym miejscem do rozpoczęcia tego jest
Vector2.Dot
metoda w Unity.Ostatni blok kodu dla dodatkowego wyjaśnienia tego, co robimy:
Jeśli zrobiłeś wszystko dobrze, powinieneś dostać taką scenę ( link do pakietu unity ): Co rozumiem przez zawsze pozytywne wartości:
Metoda Z może dawać wartości ujemne:
Na przykład, pobierz pakiet unity z tego linku .
Oto kod, którego użyłem w scenie (na wieży):
Dostosowany kod 3D z X i Z jako płaszczyzną 2D:
źródło
Możesz także zastosować bardziej ogólne podejście:
Matematyka Twojego problemu już istnieje w postaci produktu skalarnego (lub produktu kropkowego) . Musisz tylko uzyskać kierunki osi przedniej broni i kierunek z broni do celu.
Niech W będzie przednim wektorem twojej broni.
Niech D będzie kierunkiem od twojej broni do celu. (Target.pos - Weapon.pos)
Jeśli rozwiążesz wzór produktu kropkowego
dla alfa otrzymujesz:
Musisz tylko przekonwertować radiany na stopnie i masz kąt, aby obrócić robota. (Jak wspomniałeś, broń jest ustawiona pod kątem do robota, więc musisz dodać kąt do alfa)
źródło
Wszystkie dotychczasowe odpowiedzi są (mniej więcej) błędne, więc oto szybkie prawidłowe rozwiązanie:
Aby skierować broń w stronę celu, obróć wektor do przodu wieży do celu i dodaj kąt θ.
Znajdźmy więc θ:
Kiedy
δ' = 0
upraszcza toθ = asin(a / d)
, co odpowiada pierwszej części odpowiedzi Johna Hamiltona.Edytować:
Dodałem działający przykład.
Otwórz w JSFiddle lub użyj poniższego fragmentu:
źródło