计算机图形学大作业

一、实验要求

绘制一个简单的三维场景,可以是室内:卧室,办公室,教室,也可以是室外:运动场,公园等,加上光照效果,简单的纹理映射,透视投影;不能过于简单;可以加动画、鼠标和键盘交互。

    上交材料: project和word文档(具体内容展示,思路和心得)

二、实验思路

首先初始化窗口,定义摄像机坐标与视口坐标,利用实验二的知识内容绘制三维立体模型,定义每一个模型的坐标值以及利用变换函数实现相对位置的放置;利用实验三中的知识给整个场景进行灯光的设置;然后使用实验四中的代码实现模型材质的纹理贴图;最后进行鼠标与键盘的交互,实现鼠标可以控制摄像机的高度以及键盘的上下左右实现摄像机的移动。

三、实验代码

 

#include<windows.h>
#include<gl/glut.h>
#include<stdio.h>
#include<math.h>
#include<GL/glaux.h>
GLuint drawcube,drawsphere,drawteapot;

static float a=0.0;
static GLdouble eye=1.0;
static GLfloat locate=1.0;
static int lflag=GL_TRUE,rflag=GL_TRUE;

GLfloat planes[] = { 1.0,0.0,0.0,0.0 };
GLfloat planet[] = { 0.0,0.5,0.0,0.5 };

GLuint texture[8];    //创建一个纹理空间
AUX_RGBImageRec* LoadBMP(CHAR* Filename) //载入位图图像
{
    FILE* File = NULL;                             //文件句柄
    if (!Filename)                                //确保文件名已提供
    {
        return NULL;
    }
    File = fopen(Filename, "r");                   //尝试打开文件
    if (File)
    {
        fclose(File);                            //关闭文件
        return auxDIBImageLoadA(Filename);       //载入位图并返回指针
    }
    return NULL;                              //如果载入失败,返回NULL
}

int LoadGLTextures()  //载入位图并转换成纹理
{
    int Status = FALSE;                         //状态指示器
    AUX_RGBImageRec* TextureImage[8];         //创建纹理的存储空间
    memset(TextureImage, 0, sizeof(void*) * 8);//初始化
//载入位图,检查有无错误,如果位图没找到则退出
    char* image[] = {
        (char*)"texture.bmp",
        (char*)"texture1.bmp",
        (char*)"texture2.bmp",
        (char*)"texture3.bmp",
        (char*)"texture4.bmp",
        (char*)"texture5.bmp",
        (char*)"texture6.bmp",
        (char*)"texture7.bmp",
    };
    for (int i = 0; i < 8; i++)
    {
        if (TextureImage[i] = LoadBMP(image[i]))
        {
            Status = TRUE;
            glGenTextures(1, &texture[i]);
            //使用来自位图数据生成的纹理
            glBindTexture(GL_TEXTURE_2D, texture[i]);
            //指定二维纹理
            glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        }
        if (TextureImage[i])               //纹理是否存在
        {
            if (TextureImage[i]->data)     //纹理图像是否存在
            {
                free(TextureImage[i]->data);      //释放纹理图像占用的内存
            }
            free(TextureImage[i]);        //释放图像结构
        }
    }

    return Status;                   //返回Status
}

void reshape(int w, int h)
{

    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90,w/h,0.5,1000);  //透视效果
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(80,100,300,0,0,0,0,10,0);//设置观察点

}
void init1() //初始化
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //画出正方体显示列表
    drawcube = glGenLists(1);
    glNewList(drawcube, GL_COMPILE);
    glutSolidCube(1);
    glEndList();

    //画出茶壶显示列表
    drawteapot = glGenLists(1);
    glNewList(drawteapot, GL_COMPILE);
    glutSolidTeapot(1);
    glEndList();


    //设置普通灯光照0位置及参数;
    GLfloat position0[] = { 30,5,30,1 };
    GLfloat light0s[] = { 0.10,0.10,0.10,0.0 };
    GLfloat light0d[] = { 0.6,0.7,0.7 };
    GLfloat light0a[] = { 0.9,0.9,0.9 };

    glLightfv(GL_LIGHT0, GL_POSITION, position0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0s);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0d);
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0a);

    //设置探照灯光照1位置及参数
    GLfloat position1[] = { -60,40,0,1 };
    GLfloat light1s[] = { 1.0,1.0,1.0,1.0 };
    GLfloat light1d[] = { 0.06,0.1,0.1 };
    GLfloat light1a[] = { 0.91,0.99,0.96 };
    GLfloat  direction[] = { 0,-60,0,1 };
    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction);
    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30.0);
    glLightfv(GL_LIGHT1, GL_POSITION, position1);
    glLightfv(GL_LIGHT1, GL_SPECULAR, light1s);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1d);
    glLightfv(GL_LIGHT1, GL_AMBIENT, light1a);

    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);

    LoadGLTextures();

}

void draw()  //绘制
{
    if(lflag)
    glEnable(GL_LIGHT0);
    if(rflag)
    glEnable(GL_LIGHT1);
    glClearColor(0.51,0.40,0.5,0.0); //背景色
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(a,0.0,1.0,0.0);
    glScaled(eye,eye,eye);
    glTranslatef(0,locate,0);
    glPushMatrix();

    //房子地面贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[4]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //房子地面
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(0,-20,0);
    glScalef(147.5,1,147.5);
    glRotatef(90, 1, 0, 0);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);

    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//

    //房顶贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[7]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //房顶
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT);
    glColor4f(1.0, 1.0, 1.0, 0.0);
    glTranslatef(0, 75, 0);
    glScalef(147.5, 1, 147.5);
    glRotatef(90, 1, 0, 0);
    glCallList(drawcube);
    glColor4f(0.0, 1.0, 0.0, 0.0);
    glutSolidCube(1);

    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//


    //草坪贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[6]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //草坪
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.5);
    glTranslatef(0,-22,0);
    glScalef(700,2,700);
    glRotatef(90, 1, 0, 0);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.5);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//

    //土地
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(210.0/255,105.0/255,30.0/255,0.5);
    glTranslatef(0,-32,0);
    glScalef(700,20,700);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.5);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //墙贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //墙1
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(75,0,0);
    glScalef(2,150,150);
    glRotatef(90, 0, 1, 0);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //墙2
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(-75,0,0);
    glScalef(2,150,150);
    glRotatef(90,0,1,0);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //墙3
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(0,0,-75);
    glScalef(150,150,2);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //墙4
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(-45,0,75);
    glScalef(60,150,2);
    glCallList(drawcube);
    glColor4f(1.0,1.0,1.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //墙5
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(45,0,75);
    glScalef(60,150,2);
    glCallList(drawcube);
    glColor4f(1.0,1.0,1.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //墙6
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,0.0);
    glTranslatef(0,60,75);
    glScalef(30,30,2);
    glCallList(drawcube);
    glColor4f(1.0,1.0,1.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//
    
    //门贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //门
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1,1,1,0.0);
    glTranslatef(15,0,85);
    glScalef(2,90,20);
    glRotatef(90,0,1,0);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//

    //墙柱贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //墙柱
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,1.0);
    glTranslatef(75,0,-75);
    glScalef(10,150,10);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,1.0);
    glTranslatef(-75,0,-75);
    glScalef(10,150,10);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,1.0);
    glTranslatef(75,0,75);
    glScalef(10,150,10);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,1.0,1.0);
    glTranslatef(-75,0,75);
    glScalef(10,150,10);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//

    //树干贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[3]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    //树干
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1,1,1,1.0);
    glTranslatef(-120,0,120);
    glScalef(15,120,15);
    glRotatef(90, 0, 1, 1);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//

    //白 枕头
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,1.0,0.9,0.0);
    glTranslatef(-62.5,-7,-67);
    glScalef(18,5,9);
    glCallList(drawcube);
    glColor4f(0.0,1.0,0.0,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //床
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.01,0.0);
    glTranslatef(-70,-15,-70);
    glScalef(3,10,3);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.01,0.0);
    glTranslatef(-55,-15,-70);
    glScalef(3,10,3);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.01,0.0);
    glTranslatef(-70,-15,-40);
    glScalef(3,10,3);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.01,0.0);
    glTranslatef(-55,-15,-40);
    glScalef(3,10,3);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();//床板
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.01,0.0);
    glTranslatef(-62.5,-10,-55);
    glScalef(17,5,32);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();//红 被子
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1.0,0.0,0.0,0.0);
    glTranslatef(-62.5,-7,-50);
    glScalef(18,5,25);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

  //绘制四个桌腿:
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0, 0, 0, 0.0);
    glTranslatef(20,-10,-20);
    glScalef(1,20,1);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0, 0, 0, 0.0);
    glTranslatef(-20,-10,-20);
    glScalef(1,20,1);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0, 0, 0, 0.0);
    glTranslatef(-20,-10,20);
    glScalef(1,20,1);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0, 0, 0, 0.0);
    glTranslatef(20,-10,20);
    glScalef(1,20,1);
    glCallList(drawcube);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();


    //桌面贴图
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[5]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

  //画出桌面:
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(1,1,1,0);
    glScalef(50,1,50);
    glRotatef(90, 1, 0, 0);
    glCallList(drawcube);
    glColor4f(0.39,0.30,0.1,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//


 //绘制两边台阶;
    glPushMatrix();//左边第一级台阶
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.2,1.0);
    glTranslatef(-32,-12,0);
    glScalef(10,4,50);
    glCallList(drawcube);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.1,0.50,0.51,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();// 右边第一级台阶
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.51,0.40,0.2,1.0);
    glTranslatef(32,-12,0);
    glScalef(10,4,50);
    glCallList(drawcube);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.1,0.50,0.51,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();


    glPushMatrix();//左边第二级台阶
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.5,0.40,0.3,0.0);
    glTranslatef(-34.5,-8,0);
    glScalef(5,4,50);
    glCallList(drawcube);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.1,0.50,0.51,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPushMatrix();//右边第二级台阶
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.5,0.40,0.3,0.0);
    glTranslatef(34.5,-8,0);
    glScalef(5,4,50);
    glCallList(drawcube);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.1,0.50,0.51,0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //桌面上摆放物品,茶壶
    glPushMatrix();//茶壶
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.1,0.1,0.1,0.0);
    glTranslatef(0,8,0);
    glScalef(5,10,5);
    glCallList(drawteapot);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    GLUquadricObj *pObj;
    glPushMatrix();//第一个杯子  左边
    pObj=gluNewQuadric();
    gluQuadricNormals(pObj,GLU_SMOOTH);
    glTranslatef(-8,6,-8);
    glRotatef(90,1,0,0);
    gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);
    glPopMatrix();

    glPushMatrix();  //第2个杯子 右边
    glTranslatef(8,6,8);
    glRotatef(90,1,0,0);
    gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);
    glPopMatrix();
    glPushMatrix();  //第3个杯子
    glTranslatef(-8,6,8);
    glRotatef(90,1,0,0);
    gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);
    glPopMatrix();
    glPushMatrix();  //第4个杯子
    glTranslatef(8,6,-8);
    glRotatef(90,1,0,0);
    gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);
    glPopMatrix();
    glPushMatrix();  //桌面上垫圈
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor4f(0.21,0.21,0.21,0.0);

    pObj= gluNewQuadric();
    //gluQuadricDrawStyle(pObj3,GLU_LINE);
    glTranslatef(-8,1,-8);
    glRotatef(90,1,0,0);
    gluDisk(pObj, 0.50f,  3.0f, 10, 10);
    glPopMatrix();

    glPushMatrix();  //桌面上垫圈

    pObj = gluNewQuadric();
    glTranslatef(8,1,8);
    glRotatef(90,1,0,0);
    gluDisk(pObj, 0.50f,  3.0f, 30, 30);
    glPopMatrix();
    glPushMatrix();  //桌面上垫圈

    pObj = gluNewQuadric();
    glTranslatef(-8,1,8);
    glRotatef(90,1,0,0);
    gluDisk(pObj, 0.50f,  3.0f, 30, 30);
    glPopMatrix();
    glPushMatrix();  //桌面上垫圈

    pObj = gluNewQuadric();
    glTranslatef(8,1,-8);
    glRotatef(90,1,0,0);
    gluDisk(pObj, 0.50f,  3.0f, 30, 30);
    glPopMatrix();
    
    glPushMatrix(); //月亮
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor3f(1.0,1.0,0.0);//moon
    glTranslatef(200,180,200);
    glutSolidSphere(35.0,20,20);
    glCallList(drawteapot);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //外地面贴图-树叶
    glPushMatrix();//
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);

    glBindTexture(GL_TEXTURE_2D, texture[6]);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);
    glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);//

    glPushMatrix();  //树叶
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT);
    glColor3f(0.0,100.0/255,0.0);//leaf
    glTranslatef(-120,90,120);
    glutSolidSphere(50.0,5,5);
    glCallList(drawteapot);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glDisable(GL_TEXTURE_2D);//
    glPopMatrix();//

    glPushMatrix();//哑铃球
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT);
    glColor3f(0.0,0.0, 0.0);
    glTranslatef(-62.5, -15, 10);
    glutSolidSphere(4.0, 12, 10);
    glCallList(drawteapot);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();
    glPushMatrix();//哑铃球
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT);
    glColor3f(0.0, 0.0, 0.0);
    glTranslatef(-62.5, -15, 30);
    glutSolidSphere(4.0, 12, 10);
    glCallList(drawteapot);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    //哑铃棍
    glPushMatrix();
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT);
    glColor4f(0, 0, 0, 1.0);
    glTranslatef(-62.5, -15, 20);
    glScalef(1.5, 1.5, 20);
    glCallList(drawcube);
    glColor4f(0.0, 1.0, 0.0, 0.0);
    glutSolidCube(1);
    glDisable(GL_COLOR_MATERIAL);
    glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}
void NormalKeysProc(unsigned char key,int x,int y) //退出按键
{
    if(key==27) exit(0);
}
void SpecialKeys(int key, int x, int y)  //按键功能
{
    if (key == GLUT_KEY_LEFT)
    {
        a += 1.0;
        glutPostRedisplay();
    }
    if (key == GLUT_KEY_RIGHT)
    {
        a -= 1.0;
        glutPostRedisplay();
    }
    if (key == GLUT_KEY_DOWN)
    {
        eye -= 0.05;
        glutPostRedisplay();
    }
    if (key == GLUT_KEY_UP)
    {
        eye += 0.05;
        glutPostRedisplay();
    }
   
}
void MouseFunc(int button, int state, int x, int y) {
    switch (state) {
    case GLUT_UP:
        switch (button) {
        case GLUT_LEFT_BUTTON:
            locate += 5.0;
            glutPostRedisplay();
            break;
        case GLUT_RIGHT_BUTTON:
            locate -= 5.0;
            glutPostRedisplay();
            break;
        }
    }
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("finally"); 
    init1();
    glutDisplayFunc(draw);
    glutReshapeFunc(reshape);
    glutIdleFunc(draw);
    glutKeyboardFunc(NormalKeysProc);
    glutSpecialFunc(SpecialKeys);
    glutMouseFunc(MouseFunc);
    glutMainLoop();
    return 0;
}

四、实验结果与心得

10374bf3bbe94c7c99aac811aecd3024.png86fd5b87e86245bfaf6a8b5d52c70513.png3274ea19c4314ed2afd8c146cc82751c.png85591b9169a44275b3be1184496e24f8.pngafd7b610008d497fa7708cd62fea6aee.png775df1b09bd04a47919a4d7d846bd8f6.png

 

本次作业,对模型的坐标值的计算进行放置比较复杂,其次还有赋予材质贴图时也出现了各式各样的毛病,比如进行一个贴图的赋予时,就会给整个场景赋予相同的贴图;之后进行修改代码,最后可以给每一个模型进行赋予材质,但也只有几个面的贴图铺张是正确的显示,目前尚未解决。通过此次大作业,对图形学中三维可编程绘制流水线已经有部分的了解与学习。虽然过程中有各式各样的困难但也是逐个击破,对今后的学习也是有了较大的帮助。

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐