/**//*旭东 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();}