Thread View: pl.comp.grafika.grafika3d
1 messages
1 total messages
Started by Andrzej
Fri, 11 Mar 2011 16:54
Obracanie obiektu
Author: Andrzej
Date: Fri, 11 Mar 2011 16:54
Date: Fri, 11 Mar 2011 16:54
69 lines
4026 bytes
4026 bytes
Chciałby odświeżyć pewien wątek, ponieważ mam pewien problem z
obracaniem modelu za pomocą OpenGL.
Oryginalny wątek znajduje się pod tym adresem:
https://groups.google.com/group/pl.comp.grafika.grafika3d/browse_thread/thread/cff36998b1443258/bb8baefcaa26644a?hl=pl&lnk=gst&q=obroty+opengl&pli=1
Potrzebuję wykonać to, o co pytał założyciel tego wątku z drobną
modyfikacją. Mianowicie, chciałbym aby mój model obracał się wokół osi
przechodzącej przez wybrany punkt (2 punkty), a nie tylko wokół osi
przechodzącej przez jego środek obrotu.
Chciałbym zatem zrobić coś podobnego do:
1. glRotate()
2. glTranslate()
przy czym chciałbym aby osie obrotu wokoło których obracam nie były
osiami lokalnymi mojego modelu, a osiami równoległymi do osi kamery z
początkiem zaczepionym w punkcie {0,0,0}
Częściową odpowiedź na powyższy problem znalazłem w wyżej wymienionym
wątku, gdzie jeden z grupowiczów podaje rozwiązanie tego problemu:
<code>
GLfloat m[16];
GLfloat oy[4] = {0,1,0,0};
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(alpha,1.0,0.0,0.0);
glGetFloatv(GL_MODELVIE_MATRIX,m);
inverse_matrix(m); // Odwracanie macierzy
mult(m,oy); // Przeksztalcenie wektora przez macierz.
glRotatef(beta,oy[0],oy[1],oy[2]);
</code>
Kod ten zmodyfikowałem do takiej postaci, aby uwzględnić translację:
tj na końcu powyższego kodu dodałem mój własny uwzględniający
przesunięcie:
glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
glRotatef(alpha,1.0,0.0,0.0);
glGetFloatv(GL_MODELVIE_MATRIX,m);
inverse_matrix(m); // Odwracanie macierzy
mult(m,oy); // Przeksztalcenie wektora przez macierz.
glRotatef(beta,oy[0],oy[1],oy[2]);
glGetFloatv(GL_MODELVIE_MATRIX,m);
inverse_matrix(m); // Odwracanie macierzy
mult(m, WT); // Przeksztalcenie wektora przez macierz. wp-
wektorTranslacji
glTranslatef(WT[0],WT[1],WT[2]); //ponieważ chce przesunąć obiekt
wzdłuż kierunków osi kamery
ze względu na wynikową macierz w postaci TR musiałem zmodyfikować
procedurę odwracającą macierz. Ta podana w wątku dotyczy macierzy RT.
Procedura odwracania macierzy TR zmienia znak elementów translacji Tx,
Ty i Tz macierzy TR na przeciwny.
Algorytm ten działa częściowo, a obiekt przesuwa się prawidłowo
równolegle do osi kamery. Problememe jest to, że po przesunięciu
obiektu z pozycji początkowej i wykonaniu obrotu, obiekt nie obraca
się wokół osi od której został odsunięty (tj. tej zaczepionej w
punkcie {0,0,0} ), a obraca się wokół osi równoległych do kamery (tak
właśnie chcę), ale zaczepionych w środku geometrycznym modelu (tego
nie chcę, chcę aby model obracał się wokół osi od której został
odsunięty).
Czy ktoś zna sposób na rozwiązanie opisanego przez mnie problemu ??
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads