本地坐标系-->世界坐标系-->眼坐标系-->裁剪坐标系
通常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 }