Rotacje OpenGL wokół początków świata, kiedy powinny być w pobliżu pochodzenia lokalnego
Implementuję prosty system kamer w OpenGL. Ustawiłem gluPerspective pod macierzą projekcji, a następnie użyłem gluLookAt na matrycy ModelView. Po tym mam moją główną pętlę renderowania, która sprawdza zdarzenia klawiatury i, jeśli którykolwiek z klawiszy strzałek jest wciśnięty, modyfikuje prędkość kątową i prędkość do przodu (obracam się tylko przez oś y i przechodzę przez z (do przodu)). Następnie przesuwam widok za pomocą następującego kodu (deltaTime to czas, który upłynął od ostatniej renderowania klatki w sekundach w celu oddzielenia ruchu od liczby klatek na sekundę):
//place our camera
newTime = RunTime(); //get the time since app start
deltaTime = newTime - time; //get the time since the last frame was rendered
time = newTime;
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate
glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards
//draw our vertices
draw();
//swap buffers
Swap_Buffers();
Następnie kod ponownie się zapętla. Mój algorytm rysowania zaczyna się od aglPushMatrix()
i kończy naglPopMatrix()
.
Każde wywołanie funkcji glRotatef () i glTranslatef () przesuwa widok do przodu o prędkość do przodu w kierunku widoku.
Jednak gdy uruchomię kod, mój obiekt zostanie narysowany we właściwym miejscu, ale kiedy się poruszę, ruch jest wykonywany z orientacją początku świata (0,0,0 - zwróconą wzdłuż osi Z), w przeciwieństwie do orientacji lokalnej (gdzie wskazuję), a kiedy obracam, obrót odbywa się wokół (0,0,0), a nie pozycji kamery.
Skończyło się na tym dziwnym efekcie mojego aparatu orbitującego (0,0,0) w przeciwieństwie do obracania na miejscu.
Nie dzwonięglLoadIdentity()
w ogóle gdzieś w pętli i jestem pewien, że tryb Matrix jest ustawiony naGL_MODELVIEW
na całą pętlę.
Innym dziwnym efektem jest umieszczenieglLoadIdentity()
zadzwoń do środkadraw(
) Funkcja (między wywołaniami PushMatrix i PopMatrix, ekran po prostu staje się czarny i bez względu na to, gdzie patrzę, nie mogę znaleźć rysowanego obiektu).
Czy ktoś wie, co zepsułem, aby ta orbita (0,0,0) zamiast obracać się na miejscu?