【课程设计】OpenGL的3D场景模型

【题目】

opengl 3D环境开发

【内容】

绘制一个简单的三维场景,可以是室内:卧室,办公室,教室,也可以是室外:运动场,公园等,加上光照效果,透视投影,不能过于简单

可以加动画,加上鼠标和键盘交互

一、题目:

Opengl大作业

二、程序分析:

  1. 实现三维场景,可以游览以及可以看到模型物体的不同状态。
  2. 三维场景有不同的模型组合,有房子,有地球,有月球。
  3. 可以看到物体的自由移动,汽车在公路上自由移动。
  4. 可以模拟真实的光照效果,具有阴影体现,可以呈现地球的白天黑夜。
  5. 模拟粒子系统的,下雪效果。
  6. 物体旋转,地球自转和月球绕着地球转
  7. 房子有真实效果的模型和细节。

三、程序树形建模

image.png

四、程序函数解析

image.png

五、程序结构分层

省略

六、程序代码详细

void display(void)
{
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓冲以及深度缓
    glEnable(GL_TEXTURE_2D);
    gluQuadricTexture(g_text, GLU_TRUE);              //建立纹理坐标 
    gluQuadricDrawStyle(g_text, GLU_FILL);            //用面填充
    glPushMatrix();//2
    glRotatef((GLfloat)direction, 0.0, 0.0, 1.0);
    glTranslated(Ox, Oy,Oz);
    glPushMatrix();//3



    glPushMatrix();//4
    //太阳灯
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    GLfloat light1_ambient[] = { 1,1,1,1.0 };// 材料的环境光颜色
    GLfloat light1_diffuse[] = { 1,1,1,1.0 };
    GLfloat light1_specular[] = { 1,1,1,1.0 };//材料的镜面反射光颜色
    GLfloat light1_position[] = { Ox,Oy,Oz, 1.0 };//位置
    GLfloat spot_direction[] = { 20,0,0 };
    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
    glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 90.0);//高光指数
    glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
    glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
    glEnable(GL_LIGHT1);
    glPopMatrix();//4

    glPushMatrix();//5
    glRotatef(spin, 0.0, 0.0, 1.0);
    glBindTexture(GL_TEXTURE_2D, texName[4]);
    gluSphere(g_text, 60, 3600, 3600);//地球
        //------------月亮-------------
    glPushMatrix();//6
    glRotatef((GLfloat)direction, 0.0, 0.0, 1.0);
    glTranslated(-100, 0, 0.0);
    glBindTexture(GL_TEXTURE_2D, texName[5]);
    gluSphere(g_text, 6, 200, 200);
    glPopMatrix();//6
    glPopMatrix();//5
    
    //光照压栈
    glPushMatrix();//7
    lightinit(Ox, Oy);
    glPopMatrix();//7

    glPopMatrix();//4

    //--------------------------汽车压栈
    //前
    glPushMatrix();//1
    if (cargo1==1) {
        car1 -=0.05;
    }
    else {
        car1 += 0.05;
    }
    if (car1 <= -37) {
        cargo1 = 0;
    }
    if (car1 >= 37) {
        cargo1 = 1;
    }
    glTranslated(car1, 37, 2);
    glRotated(90.0, 90.0, 0.0, 1.0);
    glScalef(0.1, 0.1, 0.1);
    drawcar();
    glPopMatrix();//1

    //右
    glPushMatrix();//1
    if (cargo2 == 1) {
        car2 -= 0.05;
    }
    else {
        car2 += 0.05;
    }
    if (car2 <= -37) {
        cargo2 = 0;
    }
    if (car2 >= 37) {
        cargo2 = 1;
    }
    glTranslated(37, car2, 2);
    glRotated(90.0, 0.0, 0.0, 1.0);
    glRotated(90.0, 90.0, 0.0, 1.0);
    glScalef(0.1, 0.1, 0.1);
    drawcar();
    glPopMatrix();//1

    //左
    glPushMatrix();//1
    if (carback1 == 1) {
        car3 -= 0.05;
    }
    else {
        car3 += 0.05;
    }
    if (car3 <= -37) {
        carback1 = 0;
    }
    if (car3 >= 37) {
        carback1 = 1;
    }
    glTranslated(-37, car3, 2);
    glRotated(90.0, 0.0, 0.0, 1.0);
    glRotated(90.0, 90.0, 0.0, 1.0);
    glScalef(0.1, 0.1, 0.1);
    drawcar();
    glPopMatrix();//1

    //后
    glPushMatrix();
    glTranslated(0,-75, 0);
    glPushMatrix();//1
    if (carback2 == 1) {
        car4 -= 0.05;
    }
    else {
        car4 += 0.05;
    }
    if (car4 <= -37) {
        carback2 = 0;
    }
    if (car4 >= 37) {
        carback2 = 1;
    }
    glTranslated(car4, 37, 2);
    glRotated(90.0, 90.0, 0.0, 1.0);
    glScalef(0.1, 0.1, 0.1);
    drawcar();
    glPopMatrix();//1
    glPopMatrix();


    //外面
    glBindTexture(GL_TEXTURE_2D, texName[16]);
    Up_down(20.0, 20.0, -40.0, 40.0, -40.0, 40.0, -0.001);
    //地板
    glBindTexture(GL_TEXTURE_2D, texName[0]);
    Up_down(10.0, 10.0, -20.0, 20.0, -20.0, 20.0, 0.0);

    glBindTexture(GL_TEXTURE_2D, texName[20]);
    Up_down(10.0, 1.0, -40.0, 40.0, -40.0, -35, 0.0);
    Up_down(10.0, 1.0, -40.0, 40.0, 35, 40, 0.0);
    glPushMatrix();
    glRotated(90.0, 0.0, 0.0, 1.0);
    Up_down(10.0, 1.0, -40.0, 40.0, -40.0, -35, 0.0);
    glPopMatrix();
    glPushMatrix();
    glRotated(-90.0, 0.0, 0.0, 1.0);
    Up_down(10.0, 1.0, -40.0, 40.0, -40.0, -35, 0.0);
    glPopMatrix();

    //--------------室外墙----------------
    glBindTexture(GL_TEXTURE_2D, texName[1]);
    //左边墙
    Left_right(3.0, 1.0, -20.0,-20.0,20.0,0.0,10.0);
    //右边墙
    Left_right(3.0, 1.0, 20.0, -20.0, 20.0, 0.0, 10.0);
    //后边墙
    Before_back(3.0, 1.0, -20.0, 20.0, -20.0, 0.0, 10.0);
    //前边墙
    Before_back(3.0, 1.0, -20.0, 20.0, 20.0, 0.0, 10.0);

    //--------------屋顶----------------
    glBindTexture(GL_TEXTURE_2D, texName[2]);
    Up_down(4.0, 4.0, -20.0,20.0,-20.0,20.0,10.0);

    //门
    glBindTexture(GL_TEXTURE_2D, texName[11]);
    Before_back(1.0, 1.0, -18.0, -15.0, 19.99, 0.0, 5.0);//大厅
    Before_back(1.0, 1.0, -18.0, -15.0, 20.01, 0.0, 5.0);//

    glBindTexture(GL_TEXTURE_2D, texName[11]);
    Before_back(1.0, 1.0, -8.0, -5.5, 4.99, 0.0, 5.0);//卫生间
    Before_back(1.0, 1.0, -8.0, -5.5, 5.01, 0.0, 5.0);//卫生间
    //---------------------------------------------------------------------大厅--------------------------------------------------
    //--------------电视墙----------------

    glBindTexture(GL_TEXTURE_2D, texName[8]);
    Left_right(1.0, 1.0, 19.9, 0.0, -20.0, 0.0, 10.0);

    //--------------电视----------------

    glBindTexture(GL_TEXTURE_2D, texName[6]);
    Left_right(1.0, 1.0, 19.8, -6.0, -14.0, 3.0, 7.0);

    //--------------电视柜子----------------
    
    glBindTexture(GL_TEXTURE_2D, texName[7]);
    //前面
    Left_right(1.0, 1.0, 18.0, -6.0, -14.0, 0.0, 2.3);
    //四周
    glBindTexture(GL_TEXTURE_2D, texName[9]);
    //左边
    Before_back(1.0, 1.0, 18.0, 20.0,-6.0, 0.0, 2.3);
    //右边
    Before_back(1.0, 1.0, 18.0, 20.0, -14.0, 0.0, 2.3);
    //上面
    Up_down(1.0, 1.0, 18.0, 20.0, -6.0, -14.0, 2.3);

    //沙发组合-------------------------------------
    glBindTexture(GL_TEXTURE_2D, texName[19]);
    Left_right(1.0, 1.0, 5.0, -7.0, -12.0, 0.0, 3.0);
    Left_right(1.0, 1.0, 7.0, -7.0, -12.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.5, 7.0, -7.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.0, 5.5, -7.0, 0.0, 3);
    Before_back(1.0, 1.0, 5.5, 7.0, -12.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.0, 5.5, -12.0, 0.0, 3);
    glBindTexture(GL_TEXTURE_2D, texName[18]);
    Up_down(1.0, 1.0, 5.0,7.0, -7.0, -12.0, 1.5);
    Left_right(1.0, 1.0, 5.5, -7.0, -12.0,1.5, 3.0);

    glPushMatrix();
    glRotatef(90, 0.0, 0.0, 1.0);
    glTranslated(-20,0, 0.0);
    glBindTexture(GL_TEXTURE_2D, texName[19]);
    Left_right(1.0, 1.0, 5.0, -7.0, -12.0, 0.0, 3.0);
    Left_right(1.0, 1.0, 7.0, -7.0, -12.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.5, 7.0, -7.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.0, 5.5, -7.0, 0.0, 3);
    Before_back(1.0, 1.0, 5.5, 7.0, -12.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.0, 5.5, -12.0, 0.0, 3);
    glBindTexture(GL_TEXTURE_2D, texName[18]);
    Up_down(1.0, 1.0, 5.0, 7.0, -7.0, -12.0, 1.5);
    Left_right(1.0, 1.0, 5.5, -7.0, -12.0, 1.5, 3.0);
    glPopMatrix();

    glPushMatrix();
    glRotatef(-90, 0.0, 0.0, 1.0);
    glTranslated(-1, 19, 0.0);
    glBindTexture(GL_TEXTURE_2D, texName[19]);
    Left_right(1.0, 1.0, 5.0, -7.0, -12.0, 0.0, 3.0);
    Left_right(1.0, 1.0, 7.0, -7.0, -12.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.5, 7.0, -7.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.0, 5.5, -7.0, 0.0, 3);
    Before_back(1.0, 1.0, 5.5, 7.0, -12.0, 0.0, 1.5);
    Before_back(1.0, 1.0, 5.0, 5.5, -12.0, 0.0, 3);
    glBindTexture(GL_TEXTURE_2D, texName[18]);
    Up_down(1.0, 1.0, 5.0, 7.0, -7.0, -12.0, 1.5);
    Left_right(1.0, 1.0, 5.5, -7.0, -12.0, 1.5, 3.0);
    glPopMatrix();


    //--------------门口柜子----------------

    glBindTexture(GL_TEXTURE_2D, texName[7]);
    //前面
    Left_right(2.0, 1.0, -12.0,20.0, 5.0, 0.0, 2.3);
    Left_right(2.0, 1.0, -12.0, 20.0, 5.0, 7.7,10.0);
    //四周
    glBindTexture(GL_TEXTURE_2D, texName[9]);
    Before_back(1.0, 1.0, -12.0, -10.0, 5.0, 0.0, 2.3);
    //上面
    Up_down(2.0, 1.0, -12.0, -10.0, 20.0,5.0, 2.3);
    //四周
    Before_back(1.0, 1.0, -12.0, -10.0, 5.0, 7.7,10.0);
    //下面
    Up_down(2.0, 1.0, -12.0, -10.0, 20.0, 5.0, 7.7);

    //--------------左音响----------------
    
    glBindTexture(GL_TEXTURE_2D, texName[3]);
    //前面
    Left_right(1.0, 1.0, 19.0, -3.5, -4.5, 0.0, 4.0);
    //四周
    glBindTexture(GL_TEXTURE_2D, texName[10]);
    //左边
    Before_back(1.0, 1.0, 19.0, 20.0, -3.5, 0.0, 4.0);
    //右边
    Before_back(1.0, 1.0, 19.0, 20.0, -4.5, 0.0, 4.0);
    //上面
    Up_down(1.0, 1.0, 19.0, 20.0, -3.5, -4.5, 4.0);

    //--------------右音响---------------
    glBindTexture(GL_TEXTURE_2D, texName[3]);
    //前面
    Left_right(1.0, 1.0, 19.0, -15.5, -16.5, 0.0, 4.0);
    //四周
    glBindTexture(GL_TEXTURE_2D, texName[10]);
    //左边
    Before_back(1.0, 1.0, 19.0, 20.0, -15.5, 0.0, 4.0);
    //右边
    Before_back(1.0, 1.0, 19.0, 20.0, -16.5, 0.0, 4.0);
    //上面
    Up_down(1.0, 1.0, 19.0, 20.0, -15.5, -16.5, 4.0);

    //--------------餐桌------------------
    glBindTexture(GL_TEXTURE_2D, texName[9]);
    Up_down(2.0, 2.0, -15.0, -13.0, -13, -15, 2.0);
    Up_down(2.0,2.0, -15.0, -13.0, -13, -15, 1.9);
    Before_back(1.0, 1.0, -15.0, -13.0, -15.0, 1.9, 2.0);
    Before_back(1.0, 1.0, -13.0, -13.0, -15.0, 1.9, 2.0);
    Left_right(1.0, 1.0, -15.0, -13.0, -15.0, 1.9, 2.0);
    Left_right(1.0, 1.0, -13.0, -13.0, -15.0, 1.9, 2.0);
    //逆时针
    //1
    Before_back(1.0, 1.0, -14.8, -14.6, -14.8, 0.0, 2.0);
    Before_back(1.0, 1.0, -14.8, -14.6, -14.6, 0.0, 2.0);
    Left_right(1.0, 1.0, -14.6, -14.6, -14.8, 0.0, 2.0);
    Left_right(1.0, 1.0, -14.8, -14.6, -14.8, 0.0, 2.0);
    //2
    Before_back(1.0, 1.0, -13.4, -13.2, -14.8, 0.0, 2.0);
    Before_back(1.0, 1.0, -13.4, -13.2, -14.6, 0.0, 2.0);
    Left_right(1.0, 1.0, -13.4, -14.6, -14.8, 0.0, 2.0);
    Left_right(1.0, 1.0, -13.2, -14.6, -14.8, 0.0, 2.0);
    //3
    Before_back(1.0,  1.0, -13.4, -13.2, -13.3, 0.0, 2.0);
    Before_back(1.0, 1.0, -13.4, -13.2, -13.2, 0.0, 2.0);
    Left_right(1.0,1.0, -13.4, -13.4, -13.2, 0.0, 2.0);
    Left_right(1.0,  1.0, -13.2, -13.4, -13.2, 0.0, 2.0);
    //4
    Before_back(1.0, 1.0, -14.8, -14.6, -13.3, 0.0, 2.0);
    Before_back(1.0, 1.0, -14.6, -14.6, -13.2, 0.0, 2.0);
    Left_right(1.0, 1.0, -14.6, -13.4, -13.2, 0.0, 2.0);
    Left_right(1.0, 1.0, -14.8, -13.4, -13.2, 0.0, 2.0);

    //------------------------椅子------------
    Up_down(1.0, 1.0, -14.3, -13.7, -16.0, -15.4, 1.3);
    Before_back(1.0, 1.0, -14.3, -13.7, -16.0, 0.0, 1.3);
    Before_back(1.0, 1.0, -14.3, -13.7, -15.4, 0.0, 1.3);
    Left_right(1.0, 1.0, -13.7, -16.0, -15.4, 0.0, 1.3);
    Left_right(1.0, 1.0, -14.3, -16.0, -15.4, 0.0, 1.3);


    Up_down(1.0, 1.0, -14.3, -13.7, -12.6, -12, 1.3);
    Before_back(1.0, 1.0, -14.3, -13.7, -12.6, 0.0, 1.3);
    Before_back(1.0, 1.0, -14.3, -13.7, -12, 0.0, 1.3);
    Left_right(1.0, 1.0, -13.7, -12.6, -12, 0.0, 1.3);
    Left_right(1.0, 1.0, -14.3, -12.6, -12, 0.0, 1.3);

    Up_down(1.0, 1.0, -12.6, -12, -14.3, -13.7, 1.3);
    Before_back(1.0, 1.0, -12.6, -12, -14.3, 0.0, 1.3);
    Before_back(1.0, 1.0, -12.6, -12, -13.7, 0.0, 1.3);
    Left_right(1.0, 1.0, -12.6, -14.3, -13.7, 0.0, 1.3);
    Left_right(1.0, 1.0, -12.0, -14.3, -13.7, 0.0, 1.3);

    Up_down(1.0, 1.0, -16.0, -15.4, -14.3, -13.7, 1.3);
    Before_back(1.0, 1.0, -16.0, -15.4, -14.3, 0.0, 1.3);
    Before_back(1.0, 1.0, -16.0, -15.4, -13.7, 0.0, 1.3);
    Left_right(1.0, 1.0, -16.0, -14.3, -13.7, 0.0, 1.3);
    Left_right(1.0, 1.0, -15.4, -14.3, -13.7, 0.0, 1.3);

    //水族箱

    Before_back(1.0, 1.0, -5.0, -3, -5, 0.0, 1.0);
    Before_back(1.0, 1.0, -5.0,-3.0, -15, 0.0, 1.0);
    Left_right(1.0, 1.0, -5.0, -5.0, -15.0, 0.0, 1.0);
    Left_right(1.0, 1.0, -3.0, -5.0, -15.0, 0.0, 1.0);
    glBindTexture(GL_TEXTURE_2D, texName[15]);
    Before_back(1.0, 1.0, -5.0, -3.0, -5, 1.0, 5.0);
    Before_back(1.0, 1.0, -5.0, -3.0, -15, 1.0, 5.0);
    Left_right(1.0, 1.0, -5.0, -5.0, -15.0, 1.0, 5.0);
    Left_right(1.0, 1.0, -3.0, -5.0, -15.0, 1.0, 5.0);

    //全家福
    glBindTexture(GL_TEXTURE_2D, texName[21]);
    Before_back(1.0, 1.0, 3.0, 13.0, -0.01, 2.0, 8.0);//
    Before_back(1.0, 1.0, 3.0, 13.0, -19.99, 2.0, 8.0);//

    glBindTexture(GL_TEXTURE_2D, texName[22]);
    Before_back(1.0, 1.0, 3.0, 13.0, 0.01, 2.0, 8.0);//

    //-------------------------------------------------------卫生间--------------------------------------------------------
    glBindTexture(GL_TEXTURE_2D, texName[1]);
    Before_back(2.0, 1.0, -10.0, -3.0, 5.0, 0.0, 10.0);//卫生间墙
    Left_right(2.0, 1.0, -10.0, 5.0, 20.0, 0.0, 10.0);//大门墙
    glBindTexture(GL_TEXTURE_2D, texName[16]);
    Up_down(1.0,1.0,-10.0,-3.0,20.0,15.0,1);//蹲坑
    Before_back(1.0, 1.0, -10.0, -3.0, 15.0, 0.0, 1);//
    glBindTexture(GL_TEXTURE_2D, texName[17]);
    Up_down(1.0, 1.0, -8.0, -5.0, 19.0, 16.0, 1.001);//蹲坑

    //----------------------------------------------------------房间-------------------------------------------------------
    glBindTexture(GL_TEXTURE_2D, texName[1]);
   //前边墙
    Before_back(2.0, 1.0, -3.0, 20.0, 0.0, 0.0, 10.0);//
    //左边墙    
    Left_right(2.0, 1.0, -3.0, 20.0, 0.0, 0.0, 10.0);//房门墙
    //门
    glBindTexture(GL_TEXTURE_2D, texName[11]);
    Left_right(1.0, 1.0, -2.99, 1.0, 3.5, 0.0, 5.0);
    Left_right(1.0, 1.0, -3.01, 1.0, 3.5, 0.0, 5.0);
    //窗
    glBindTexture(GL_TEXTURE_2D, texName[12]);
    Before_back(1.0, 1.0, 0.0, 7.0, 19.99, 3.0, 7.0);

    //婚纱照
    glBindTexture(GL_TEXTURE_2D, texName[23]);
    Before_back(1.0, 1.0, 14.0, 19.0, 19.99, 3.0, 7.0);
    //-------床----------
    glBindTexture(GL_TEXTURE_2D, texName[10]);
    Before_back(1.0, 1.0, 13.0, 20.0, 19.3, 0.0, 2.5);
    Left_right(1.0, 1.0, 13.0, 20.0, 19.3, 0.0, 2.5);
    Up_down(1.0, 1.0, 13.0, 20.0, 20.0, 19.3, 2.5);
    Up_down(1.0, 1.0, 13.0, 20.0, 20.0, 11.0, 1.0);
    Left_right(1.0, 1.0, 13.0, 20.0,11.0, 0.0, 1.0);
    Before_back(1.0, 1.0, 13.0, 20.0,11.0, 0.0, 1.0);
    //被子
    glBindTexture(GL_TEXTURE_2D, texName[13]);
    Up_down(1.0, 1.0, 12.99, 20.0, 17.0, 11.0, 1.01);
    Left_right(1.0, 1.0, 12.99,17.0, 11.0, 0.0, 1.01);
    //枕头
    glBindTexture(GL_TEXTURE_2D, texName[14]);
    Before_back(1.0, 1.0, 17.0, 19.0, 18.0, 0.0, 1.5);
    Left_right(1.0, 1.0, 17.0, 20.0, 18.0, 0.0,1.5);
    Up_down(1.0, 1.0, 17.0, 19.0, 20.0, 18.0, 1.5);

    Before_back(1.0, 1.0, 14.0, 16.0, 18.0, 0.0, 1.5);
    Left_right(1.0, 1.0, 14.0, 20.0, 18.0, 0.0, 1.5);
    Up_down(1.0, 1.0, 14.0, 16.0, 20.0, 18.0, 1.5);

    //学习桌
    glBindTexture(GL_TEXTURE_2D, texName[10]);
    Up_down(1.0, 1.0,6.0,9.0,1.5, 0.0, 2.0);
    Up_down(1.0, 1.0, 6.0, 9.0, 1.5, 0.0, 1.8);
    Left_right(1.0, 1.0, 6.0, 1.5, 0.0, 0.0, 2);
    Left_right(1.0, 1.0, 9.0, 1.5, 0.0, 0.0, 2);
    Left_right(1.0, 1.0, 6.2, 1.5, 0.0, 0.0, 2);
    Left_right(1.0, 1.0, 8.8, 1.5, 0.0, 0.0, 2);
    Before_back(1.0, 1.0, 6.0, 6.2, 1.51, 0.0, 2.0);
    Before_back(1.0, 1.0, 8.8, 9.0, 1.51, 0.0, 2.0);
    Before_back(1.0, 1.0, 6.0, 9.0, 1.51, 1.8, 2.0);

    Up_down(1.0, 1.0, 7.2, 8.3, 2.0, 2.8, 1);
    Left_right(1.0, 1.0, 7.2, 2.0, 2.8, 0.0, 1);
    Left_right(1.0, 1.0, 8.3, 2.0, 2.8, 0.0, 1);
    Before_back(1.0, 1.0, 7.2, 8.3, 2.8, 0.0, 2.0);
    Before_back(1.0, 1.0, 7.2, 8.3, 2.6, 0.0, 2.0);
    Left_right(1.0, 1.0, 7.2, 2.6, 2.8, 0.0, 2);
    Left_right(1.0, 1.0, 8.3, 2.6, 2.8, 0.0, 2);
    Up_down(1.0, 1.0, 7.2, 8.3, 2.6, 2.8, 2);

    if (snow) {
        //雪花
        glPushMatrix();
        glRotated(90.0, 90.0, 0.0, 1.0);
        drawScene();//绘制场景
        glPopMatrix();//
        glPushMatrix();
        glTranslated(0, 20, 0);
        glRotated(90.0, 90.0, 0.0, 1.0);
        drawScene();//绘制场景
        glPopMatrix();//
        glPushMatrix();
        glTranslated(0, -20, 0);
        glRotated(90.0, 90.0, 0.0, 1.0);
        drawScene();//绘制场景
        glPopMatrix();//
        glTranslated(0, 30, 0);
        glRotated(90.0, 90.0, 0.0, 1.0);
        drawScene();//绘制场景
        glPopMatrix();//
    }
    glPopMatrix();//3
    glPopMatrix();//2
    glFlush();//用于强制刷新缓存
    glutSwapBuffers();//交换双缓存
    glutPostRedisplay();//标志下次刷新,没有的话,程序打开后不会刷新界面
}

七、程序运行结果

地月系

image.png

汽车移动:

image.png

大厅

image.png

image.png

餐桌

image.png

电视墙:

image.png

image.png

沙发:

image.png

水族箱

image.png

卫生间:

image.png

房间:

image.png

image.png

雪花:

image.png

八、课程心得体会

本次大作业运用了光照,粒子系统,模型等综合项目,模型中运用了大量的纹理贴图来充实这个场景的细节,在模型运动和视角转换的过程中运用了矩阵的转换来实现,具体了解了世界视角和视觉视角的矩阵转换,投影模型过程,对纹理和光照各个属性的设置来呈现不同的效果。此程序是基于地月系,然后房子各个细节的呈现,是综合性的小程序。通过本次大作业,能更好的运用opengl的函数绘制场景,更能了解到图形在计算机的程序的原理与运用,宏观的接触了图形学的领域。

九、特别部分

完整的工程包、资源包和论文报告将有偿提供,支持问题回答和配置电脑让工程跑起来,需要者可点击头部导航栏联系我