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?
Odpowiedzi:
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.
źródło
Zasadniczo możesz użyć każdej innej reprezentacji obrotu, ale Kąty Eulera. Macierze, czwartorzędy, nawet kąty osi zrobią, co chcesz.
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ę.
źródło
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.
źródło