本地座標系-->世界座標系-->眼座標系-->裁剪座標系
通常gluLookAt()用於從世界座標系到眼座標系的轉換,可是因爲OpenGL裏面模型視圖矩陣直接將本地座標系轉換爲眼座標系,因此gluLookAt()應該被用來設置模型視圖矩陣,可是有一點得注意了:
gluLookAt()的調用應該在場景繪製初glLoadIdentity()函數調用以後,在全部的glTranslate*()、glRotate*()、glScale*()函數調用以前調用,且只調用一次,相似代碼以下:函數
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(...); //這裏最好先調用glPushMatrix() //下面就能夠任意調用glTranslate*(),glRotate*(),glScale*()等函數了,注意若是再次調用了glLoadIdentity(),則須要從新調用gluLookAt() //也就是說,若是讓gluLookAt()函數調用達到想要的效果的話,gluLookAt()設置的矩陣必定是模型視圖矩陣所乘的第一個矩陣,且最多乘一次
1 #include "stdafx.h" 2 #include <GL/glut.h> 3 #include <stdlib.h> 4 5 void init(void) 6 { 7 glClearColor (0.0, 0.0, 0.0, 0.0); //背景黑色 8 } 9 10 void display(void) 11 { 12 glClear (GL_COLOR_BUFFER_BIT); 13 glColor3f (1.0, 1.0, 1.0); //畫筆白色 14 15 glLoadIdentity(); //加載單位矩陣 16 17 gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 18 glutWireTeapot(2); 19 glutSwapBuffers(); 20 } 21 22 void reshape (int w, int h) 23 { 24 glViewport (0, 0, (GLsizei) w, (GLsizei) h); 25 glMatrixMode (GL_PROJECTION); 26 glLoadIdentity (); 27 gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 28 glMatrixMode(GL_MODELVIEW); 29 glLoadIdentity(); 30 gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 31 } 32 33 int main(int argc, char** argv) 34 { 35 glutInit(&argc, argv); 36 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 37 glutInitWindowSize (500, 500); 38 glutInitWindowPosition (100, 100); 39 glutCreateWindow (argv[0]); 40 41 init (); 42 glutDisplayFunc(display); 43 glutReshapeFunc(reshape); 44 glutMainLoop(); 45 return 0; 46 }