2017-01-29 20 views
5

Tworzę grę, w której używasz pilota rotacyjnego (wie tylko jego rotację) do sterowania samochodem. Mam problem z konwersją Quaternion (to jest wyjście kontrolera) do obrotu kierownicy. To jest najbliższa do pracy forma wszystkich rzeczy, które wypróbowałem (transform.localRotation to obrót kierownicy):Jak przekonwertować obrót kwaterniona na ruch kierownicy?

void Update() { 

    transform.localRotation = GvrController.Orientation; 

    transform.localRotation = new Quaternion(0.0f, 0.0f, transform.localRotation.z, transform.localRotation.w); 

} 

To oczywiście nie jest dobre rozwiązanie i działa nie tak dobrze. Istnieje bardzo prosta wizualizacja tego, co próbuję wykonać: enter image description here Domyślna orientacja kontrolera jest skierowana do przodu, tak jak na zdjęciu.

Zasadniczo cały problem polega na tym, jak pominąć wszystkie osie inne niż odpowiedzialne za obracanie (oś 1 na zdjęciu) i zastosować ją do kierownicy. Czy wiesz, jak mogę to zrobić?

EDYTOWANIE: Ponieważ trudno jest wyjaśnić problem bez odpowiedniej wizualizacji, zrobiłem zdjęcia kontrolera i narysowałem na nich oś.

Jest to orientacja domyślne kontrolera:

enter image description here

I to jest, jak to się odbywa w osi oznaczonej na niej:

enter image description here

+0

Prawdopodobnie pomógłbyś, gdybyś podał jakieś dane wejściowe i oczekiwane wyniki, aby lepiej zrozumieć obrót, jaki daje kontroler. – FINDarkside

+0

Tak, te są nieprzyjemne do debugowania. Zaleciłbym nagrywanie przebiegów testowych z przybliżonymi znanymi oczekiwanymi kątami wyjściowymi, następnie można "odwrócić inżynierię" poprawnej formuły w dowolnym środowisku programistycznym, takim jak Matlab lub Python Spyder, a następnie przenieść ją do pożądanego języka/frameworka. – NikoNyrh

+0

Czy możesz dać nam nagranie z konwersją Eulera? –

Odpowiedz

2

Zastosowanie Quaternion.Euler i Quaternion.eulerAngles. Zauważ, że kolejność dla funkcji Euler to z, x, y, w przeciwieństwie do Vector3. EulerAngles zwraca kąt w stopniach (podczas gdy rotation.x zwraca ilość kwaternionów dla tej osi). Funkcja Eulera spodziewa kąt więc chcesz coś takiego:

Quaternion rot = GvrController.Orientation; 
transform.localRotation = Quaternion.Euler(rot.eulerAngles.z, 0, 0); 

zależności od sposobu osie kontrolera są skonfigurowane może trzeba eksperymentować z innymi kierunkami, czy to nie Y-up z przodu na przykład

transform.localRotation = Quaternion.Euler(rot.eulerAngles.x, 0, 0); 

lub

transform.localRotation = Quaternion.Euler(0, 0, rot.eulerAngles.z); 

i tak dalej. Wkrótce powinno stać się jasne, z jakiego systemu korzysta.

Ponadto, jeśli kierownica nie jest przyporządkowana do niczego, należy użyć obrotu, a nie polecenia LocalRotation.

+0

Mam taki sam problem jak poprzednio: reaguje on nie tylko na obracanie kontrolera jak na kierownicę, ale również na obracanie go do przodu i do tyłu. –

+1

Chciałem użyć orientacji kontrolerów użytkowania. Po zaktualizowaniu. Jeśli oś Z jest niepoprawna, wypróbuj inne osie. – Absinthe

+0

Nadal nie działa. Daje bardzo niespójne wyniki - kierownica zmienia kierunek wirowania lub zatrzymuje się beze mnie zmieniając kierunek obrotów sterownika.Wypróbowałem całą oś i każda z nich wydaje się odpowiadać osi, którą chcę obrócić kierownicą. –