/**/ /*旭东 2006.4创建窗口、键盘响应等实现均采用glut库函数.函数说明:void DrawGroud() 绘制网格地面.void AirRoam() 设置gluLookAt ,此函数为学习重点, 来源于www.GameRes.com*/ #include " windows.h " #include " gl/gl.h " #include " gl/glut.h " #include " math.h " #define KEY_DOWN(vk_code)((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) void DrawGroud() // 绘制网格地面 ... { glPushMatrix(); glColor3f(0.5,0.7,1.0); glTranslatef(0.0,-20.0,0.0); glBegin(GL_LINES); for(int i=-300;i<=300;i=i+5) ...{ glVertex3f(-i,0,-300); glVertex3f(-i,0,300); } for(int j=-300;j<=300;j+=5) ...{ glVertex3f(-300,0,-j); glVertex3f(300,0,-j); } glEnd(); glPopMatrix();} void AirRoam( void ) ... { // 追踪观察点的方向 static GLfloat s_eye[] = ...{ 0, 8.0, 0}; static GLfloat s_at[] = ...{ 0.0, 0.0, 0.0 }; static GLfloat s_angle = -90.0; float speed = 1.3f; float PI=3.14159f; // 旋转请求 if (KEY_DOWN(VK_LEFT)) ...{ s_angle -= 2.0; } if (KEY_DOWN(VK_RIGHT)) ...{ s_angle += 2.0; } float rad = float(PI*s_angle/180.0f); // 前进,后退请求 if (KEY_DOWN(VK_UP)) ...{ s_eye[2] += (float)sin(rad) * speed; s_eye[0] += (float)cos(rad) * speed; } if (KEY_DOWN(VK_DOWN)) ...{ s_eye[2] -= (float)sin(rad) * speed; s_eye[0] -= (float)cos(rad) * speed; } // 观察点 s_at[0] = float(s_eye[0] + 100*cos(rad)); s_at[2] = float(s_eye[2] + 100*sin(rad)); s_at[1] = s_eye[1]; //设置观察点 glLoadIdentity(); gluLookAt(s_eye[0],s_eye[1],s_eye[2], s_at[0],s_at[1],s_at[2], 0.0, 1.0, 0.0); glutPostRedisplay();} void RenderScene( void ) ... { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); DrawGroud(); AirRoam(); glutSwapBuffers();} void SetupRC( void ) ... { glEnable(GL_DEPTH_TEST); glColor3f(1.0,0.0,0.0); glClearColor(0.0f, 0.0f, 1.0f, 1.0f);} void ChangeSize(GLsizei w,GLsizei h) ... { if(h==0) h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0f,(float)w/(float)h,1.0f,200.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -50.0f); } void main() ... { glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600); glutCreateWindow("Simple"); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); SetupRC(); glutMainLoop();}