Czy mogę używać czwartorzędów do sterowania helikopterem?


9

Próbuję stworzyć uproszczoną symulację helikoptera (na razie jest to sześcian) w 3D i mam pewne problemy z obrotem. Śmigłowiec może obracać się wzdłuż trzech osi:

  • obracać się za pomocą tylnego śmigła: obrót osi y
  • przechyl w lewo i prawo, aby przejść w lewo lub w prawo: obrót osi Z
  • przechyl w górę i w dół, aby przejść do tyłu lub do przodu: obrót osi x

Muszę być w stanie kontrolować każdą oś indywidualnie. Do tej pory próbowałem używać kątów Eulera, ale bez względu na to, jakiej kolejności obrotu używam, albo wpadam na zamek gimbala, albo niektóre osie „zmieniają miejsca”.

Wydaje mi się, że muszę używać czwartorzędów, ale nie wiem, jak kontrolować każdą pojedynczą oś, ponieważ czwartorzędy używają kierunku i kąta. Czy powinienem utworzyć trzy czwarte i pomnożyć je razem? Czy nie skończyłbym z tymi samymi problemami?

Dziwne jest to, że jeśli użyję palca do przedstawienia trzech osi mojego helikoptera (kciuk w górę = y, indeks = z, środek = x), wydaje mi się, że nie napotkam tych problemów. Dlaczego?


Jeśli masz dostęp do wykresu scen, realną alternatywą byłoby posiadanie zagnieżdżonych kontenerów dla każdej osi, które następnie obracałeś osobno.
bummzack

@bummzack, tak, myślałem o tym. Czy jednak nie jest to to samo, co konkatenacja trzech macierzy obrotu w określonej kolejności?
podpunkt

Masz rację @Subb, staraj się nie przechowywać rotacji dla każdej osi osobno, będzie to miało takie same problemy jak Kąty Eulera, bez względu na to, czego użyjesz, również Matryce i Czwartorzędy będą wtedy cierpieć z powodu blokady Gimbal.
Maik Semder,

@Maik Semder, w jaki sposób mogę zapewnić kontrolę nad nachyleniem / odchyleniem / przechyłem mojego helikoptera?
podpunkt

@Subb @ Flip i moja odpowiedź w zasadzie mówiły ci, jak to zrobić.
Maik Semder,

Odpowiedzi:


4

Powinieneś być w stanie użyć albo matrycy, albo czwartorzędu, aby zapisać aktualną orientację helikoptera. Problemem, na który napotykasz, jest sposób zastosowania zmiany skoku / odchylenia / przechyłu w helikopterze.

Myślę, że chcesz zastosować nachylenie / odchylenie / przechylenie do helikoptera w lokalnej przestrzeni dla każdej klatki. Możesz to zrobić, biorąc zmianę skoku / odchylenia / przechylenia dla tej ramki i konstruując macierz obrotu (możesz to zrobić z kątami eulera). Następnie obracasz poprzednią orientację śmigłowca o tę matrycę (z poprzednią orientacją przedstawioną albo jako matryca, albo jako czwartorzęd). Daje orientację dla nowej ramki.

Reprezentowanie orientacji śmigłowca jako czwartorzędu ma tę zaletę, że interpolacja między czwartorzędami jest znacznie łatwiejsza niż interpolacja między macierzami. Jeśli więc w przyszłości masz bieżącą orientację i chcesz obrócić rotację na klatkę, która przyniesie ci nową orientację w pożądanym czasie, reprezentacja czwartorzędu może być dla ciebie bardziej przyjazna.


Tak to zrobiłem, zastosuj przyrostowe aktualizacje matrycy reprezentującej lokalną -> światową transformację. Pamiętaj, aby znormalizować matrycę, a po kilkuset klatkach pokaże zaokrąglone artefakty, jeśli tego nie zrobisz.
Patrick Hughes,

Ponadto, aby odpowiedzieć na ostatnie pytanie, dlaczego problem blokady gimbala nie jest widziany przy użyciu ręki do reprezentowania osi x / y / z, to dlatego, że prawdopodobnie stosuje się wartości skoku, odchylenia i rzutu do lokalnej ramy ręki odniesienie. Konstruowanie macierzy obrotu z kątami eulera zaczyna się od obrócenia wokół x świata, następnie przez wynikowe y, a następnie przez wynikowe z (rzeczywista kolejność x / y / z może różnić się kolejnością). Spróbuj zastosować obroty w ten sposób, a możesz zacząć widzieć, jak wygląda blokada gimbala.
Flip

3

Zasadniczo możesz użyć każdej innej reprezentacji obrotu, ale Kąty Eulera. Macierze, czwartorzędy, nawet kąty osi zrobią, co chcesz.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Masz rację, skończyłbyś z tymi samymi problemami. Kluczem jest zapisanie bieżącej orientacji (macierz, czwartorzęd) obiektu i zastosowanie tylko delty podczas zmiany orientacji.

Jeśli chcesz obrócić o 10 stopni wokół y, po prostu utwórz dla tego macierz delta / kwaternion i pomnóż ją z bieżącą orientacją (jeśli używasz mnożenia postu dla macierzy). Jeśli pomnożymy go na odwrót, obróci on system wokół osi Y świata, a nie wokół osi Y obiektu.

Uważam, że ten zasób jest bardzo przydatny, zawiera również kod źródłowy i bardzo dobrze wyjaśnia teorię.


-1

Myślę, że problemem może być różnica w wektorze obrotu i prędkości osi (a także to, że brakuje ci kierunku). Kiedy helikopter przechyla się do przodu, aby ruszyć do przodu, napęd śmigłowców helikoptera popycha powietrze zarówno w dół, jak i do tyłu pod kątem prostym do tego, co oznaczono na osi X.

Masz czwarty stopień swobody, za którym tęskniłeś: prędkość łopat kontroluje objętość wypychanego powietrza, a także kontroluje wysokość podnoszenia generowanego przez helikopter.

Ale mimo to „przechylenie w lewo i prawo” oraz „przechylenie w górę i w dół” zazwyczaj sterują helikopterem na danym samolocie. Oznacza to, że helikopter nie powinien latać w dół, gdy przechyla się do przodu, do tyłu lub na bok - ale wysokość podnoszenia może się zmienić i prędkość będzie kontrolowana przez „przeciwną” stronę prawego trójkąta utworzonego przez łączenie śmigłowca z ziemią linią prostą w dół (grawitacja) i przeciwprostokątną (podnoszenie). To powinno dać twój wektor prędkości do użycia.

Powinieneś być w stanie użyć do tego celu czwartorzędów, ale nie opieraj swoich liczb czwartorzędowych na nachyleniu samego helikoptera - spróbuj zamiast tego użyć sił ruchu generowanych przez helikopter.


To jednak tak naprawdę nie odpowiada na pytanie. Po prostu dodajemy do myślenia więcej jedzenia.
bummzack

Obecnie używam obrotu śmigłowca do transformacji wektora siły nośnej, który jest skierowany w górę w przestrzeni śmigłowca. Czy masz na myśli, że powinienem zrobić odwrotną czynność, tj. Zmodyfikować wektor bezpośrednio, a następnie obrócić helikopter w konsekwencji?
podpunkt

Myślę, że powinieneś zrobić obie rzeczy, co teraz robisz, a następnie wprowadzić WSZYSTKIE zmiany w rotacji helikoptera w oparciu o normalne ostrza. Tzn. Masz 2 obroty; jeden zastosowany do łopat, a drugi reprezentuje faktyczny obrót śmigłowca. Oczywiście wszystkie przechowywane w czwartorzędach.
spowolniłaviar
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.