Próbuję zaimplementować rotację za pomocą arcball/trackballa, ale mam problem z obrotem środka . Chcę, aby centrum było centrum mojego ekranu bez względu na wszystko.Jak obracać się wokół środka ekranu za pomocą kwaternionów w opengl?
Pozwól mi wyjaśnić, co zrobiłem do tej pory.
Utworzona quaterion (oś obrotowa: vector_start x vector_end przy kącie vector_start * vector_end)
Z tego kwaterniony Utworzona macierz obrotu w celu wykorzystania go glMultMatrixf (Matrix) i uzyskać pożądany obrót.
Problem polega na tym, że podczas gdy mój model wydaje się obracać tak, jak powinien, zawsze obraca się wokół swojego lokalnego pochodzenia. Jak mogę go obrócić wokół środka ekranu? Nie ważne, gdzie znajduje się jego lokalne pochodzenie?
Przypuszczam, że rozwiązaniem tego problemu może być przetłumaczenie całej osi obrotu na środku ekranu, a następnie zastosowanie obrotu, ale czy jest to możliwe? Czy tęsknię za czymś tutaj?
Tak, ale gdy zastosuję glMultMatrixf() nie opengl obraca model wokół jego lokalnego pochodzenia? Więc jeśli przetłumaczyć na początek obrotu (nie za pomocą glRotatef(), ale glMultMatrix()), a następnie przetłumaczyć z powrotem mój model będzie obracany ponownie wokół jego pochodzenia, a nie tak, jakby jego pochodzenie było na przykład środkiem ekranu. –
Przetłumacz z glTranslatef(), a następnie pomnóż z macierzą rotacji glMultMatrix() i ponownie przetłumaczyć za pomocą glTranslatef(). To w przeciwieństwie do zwykłego wywoływania glMultMatrix(). To nie działa? – catchmeifyoutry
Nie, to nie działa. To, co robi, polega na tym, że obraca model zgodnie z informacją od macierzy rotacji stosowanej przez glMultMatrixf, ale wokół jej lokalnego pochodzenia. Próbowałem przekonwertować kwaternion obrotu na kątów Eulera, a następnie zastosować glRotatef (Yaw, 0., 0., 1.); glRotatef (Pich, 0., 1., 0.); glRotatef (Roll, 1., 0., 0.); zamiast bezpośrednio zastosować glMultMatrixf(), ale wtedy, gdy obrót był mniej więcej pośrodku ekranu, nie ma on nic wspólnego z obrotowym ruchem obrotowym! –