OpenGL 练习09 Walking through a scene

#include<gl/glut.h>
#include<math.h>
#include<stdlib.h>
 
//窗口大小
int width = 600;
int height = 600;
 
//a point data type
typedef GLfloat point4[4];
typedef GLfloat color4[4];
 
//平移向量
float trans[3] = {0.01, 0.01, 0.01};
 
//平移系数(透视投影的坐标问题)
int factor = 0;
 
// 旋转角度
float angleX = 1;
float angleY = 1;
 
// 相机位置坐标
float eye[3] = {0, 0, 3};
// 相机与原点的距离
//float radius = 3;
 
//0.5
point4 vertices[8] = {{-0.5, -0.5, 0.5, 1.0}, {-0.5, 0.5, 0.5, 1.0}, {0.5, 0.5, 0.5, 1.0}, {0.5, -0.5, 0.5, 1.0},
                      {-0.5, -0.5, -0.5, 1.0},  {-0.5, 0.5, -0.5, 1.0},  {0.5, 0.5, -0.5, 1.0},  {0.5, -0.5, -0.5, 1.0}};
 
color4 colors[8] = {{1.0, 0.0, 0.0, 1.0}, {1.0, 1.0, 0.0, 1.0}, {1.0, 1.0, 1.0, 1.0}, {0.0, 1.0, 1.0, 1.0},
                    {0.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}, {1.0, 0.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}};
 
color4 quad_color[36];
point4 points[36];
 
int i = 0;
 
void quad(int a, int b, int c, int d)
{
    for (int j=0; j<4; j++) {
        quad_color[i][j] = colors[a][j];
        points[i][j] = vertices[a][j];
    }
    glVertex4fv(points[i]);
    i++;
    for (int j=0; j<4; j++) {
        quad_color[i][j] = colors[b][j];
        points[i][j] = vertices[b][j];
    }
    glVertex4fv(points[i]);
    i++;
    for (int j=0; j<4; j++) {
        quad_color[i][j] = colors[c][j];
        points[i][j] = vertices[c][j];
    }
    glVertex4fv(points[i]);
    i++;
    for (int j=0; j<4; j++) {
        quad_color[i][j] = colors[a][j];
        points[i][j] = vertices[a][j];
    }
    glVertex4fv(points[i]);
    i++;
    for (int j=0; j<4; j++) {
        quad_color[i][j] = colors[c][j];
        points[i][j] = vertices[c][j];
    }
    glVertex4fv(points[i]);
    i++;
    for (int j=0; j<4; j++) {
        quad_color[i][j] = colors[d][j];
        points[i][j] = vertices[d][j];
    }
    glVertex4fv(points[i]);
    i++;
}
 
void colorcube()
{
    quad(0, 3, 2, 1);
    quad(2, 3, 7, 6);
    quad(3, 0, 4, 7);
    quad(1, 2, 6, 5);
    quad(4, 5, 6, 7);
    quad(5, 4, 0, 1);
}
 
void renderScene(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);//注意事项:要在glClear之前设置color!
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕及深度缓存
     
    glViewport(0,0,(GLsizei)width,(GLsizei)height);
 
    glMatrixMode(GL_PROJECTION);//投影矩阵
        glLoadIdentity();
        gluPerspective(45, width/height, 1, 1000);
 
    glMatrixMode(GL_MODELVIEW);//模型矩阵
        glLoadIdentity();
        gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
         
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
 
    glEnableClientState(GL_VERTEX_ARRAY);
    colorcube();
    glVertexPointer(4, GL_FLOAT, 0, points);
    glEnableClientState(GL_COLOR_ARRAY);//启用颜色数组
    glColorPointer(4, GL_FLOAT, 0, quad_color);
    glDrawArrays(GL_TRIANGLES, 0, 36);
     
    glutSwapBuffers();//当窗口模式为双缓存时,此函数的功能就是把后台缓存的内容交换到前台显示。当然,只有单缓存时,使用它的功能跟用glFlush()一样。而使用双缓存是为了把完整图画一次性显示在窗口上,或者是为了实现动画。
}
 
void myReshape(int w, int h)
{
    if (h == 0) h = 1;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕及深度缓存
 
    glMatrixMode(GL_MODELVIEW);//模型矩阵
        glLoadIdentity();
        gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
 
    glTranslatef(trans[0], trans[1], trans[2]);
    glRotatef(angleX, 1, 0, 0);//绕x轴旋转
    glRotatef(angleY, 0, 1, 0);//绕x轴旋转
 
    glEnable(GL_DEPTH_TEST);
 
    glEnableClientState(GL_VERTEX_ARRAY);
    colorcube();
    glVertexPointer(4, GL_FLOAT, 0, points);
    glEnableClientState(GL_COLOR_ARRAY);//启用颜色数组
    glColorPointer(4, GL_FLOAT, 0, quad_color);
    glDrawArrays(GL_TRIANGLES, 0, 36);
 
    glutSwapBuffers();
}
 
void myMouse(int button,int state,int x,int y)
{
}
 
void mouseActiveMotion(int x, int y)//Active motion是指鼠标移动并且有一个鼠标键被按下
{
}
 
void myKey(unsigned char key,int x,int y)
{
    trans[0] = trans[1] = trans[2] = 0;
    if (key == 27)  exit(0);
    if (key == 'x') trans[0]+=0.01;
    if (key == 'y') trans[1]+=0.01;
    if (key == 'z') trans[2]+=0.01;
    if (key == 'X') trans[0]-=0.01;
    if (key == 'Y') trans[1]-=0.01;
    if (key == 'Z') trans[2]-=0.01;
    if (key == 'r') angleY+=5;
    if (key == 'l') angleY-=5;
    if (key == 'd') angleX+=5;
    if (key == 'u') angleX-=5;
    if (key == 'f') eye[0]-=0.05;
    if (key == 'g') eye[1]-=0.05;
    if (key == 'h') eye[2]-=0.05;
    if (key == 'F') eye[0]+=0.05;
    if (key == 'G') eye[1]+=0.05;
    if (key == 'H') eye[2]+=0.05;
    myReshape(width, height);
    //glutPostRedisplay();
}
 
void mySpeKey(int key,int x,int y)
{
}
 
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);//初始化GLUT
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);//设置图形显示模式。GLUT_DEPTH:使用深度缓存;GLUT_DOUBLE:使用双缓存;
    glutInitWindowPosition(100, 100);//设置窗口显示位置
    glutInitWindowSize(600,600);//设置窗口大小
    glutCreateWindow("Walking through a scene");//创建带标题的窗口
    glutDisplayFunc(renderScene);//为当前窗口设置显示回调函数
     glutReshapeFunc(myReshape);
 
     
    glutMouseFunc(myMouse);//func:处理鼠标click事件的函数的函数名
    glutMotionFunc(mouseActiveMotion);
    //glutPassiveMotionFunc(mousePassiveMotion);
 
    glutKeyboardFunc(myKey);
    glutSpecialFunc(mySpeKey);
 
    glutMainLoop();//进入GLUT事件处理循环
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值