一个简单的场景观察程序(OpenGL)

    技术2022-05-11  57

     

    /*旭东 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[] = 08.00};    static GLfloat s_at[]  = 0.00.00.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.01.00.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.0f0.0f1.0f1.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.0f0.0f-50.0f); } void  main() {    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH);    glutInitWindowSize(800,600);    glutCreateWindow("Simple");    glutDisplayFunc(RenderScene);    glutReshapeFunc(ChangeSize);    SetupRC();    glutMainLoop();}

    最新回复(0)