视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
计算机图形学实验报告三
2025-09-26 21:43:07 责编:小OO
文档
《计算机图形学》实验报告

一、实验目的

1,使用opengl函数写一个程序,要求对于一个茶壶的左上四分之一部分进行显示,显示区位于屏幕的右下四分之一处。

2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。

3,使用opengl函数完成一个图形动画程序,显示一个 球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。

二、实验要求

1.掌握Window图形编程的基本方法;

2.使用opengl编写控制程序

3.掌握如何进行简单动画制作

三、实验设备(环境)

Windows系统,vs2017

四、实验步骤与结果

1,    使用opengl函数写一个程序,要求对于一个茶壶的左上四分之一部分进行显示,显示区位于屏幕的右下四分之一处。

//绘图子程序

void display(void)

{

    glColor3f(1.0, 1.0, 0.0);

    glClear(GL_COLOR_BUFFER_BIT);

    //glEnable(GL_SCISSOR_TEST);

    //glScissor(0.0f,0.0f,500,300);

    glutWireTeapot(0.4);

    glFlush();

}

//窗口调整子程序

void myReshape(int w, int h)

{

    glViewport(500, -300, (GLsizei)w, (GLsizei)h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if (w <= h)

        glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);

    else

        glOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);

}

2,    使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。

}

//绘图子程序

void display(void)

{

    glColor3f(1.0, 1.0, 0.0);

    glClear(GL_COLOR_BUFFER_BIT);

    //glMatrixMode(GL_MODELVIEW);

    //glLoadIdentity();

    //设置光源的属性1

    GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )

    GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )

    GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射

    GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 )

    glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);

    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient1); // 设置环境光

    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse1); // 设置漫射光

    glLightfv(GL_LIGHT0, GL_SPECULAR, Lightspecular1);//设置镜面反射光

                                                      //设置光源的属性2

    GLfloat LightAmbient2[] = { 0.0f, 1.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )

    GLfloat LightDiffuse2[] = { 0.0f, 1.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )

    GLfloat Lightspecular2[] = { 0.0f, 1.0f, 0.0f, 1.0f }; // 镜面反射

    GLfloat LightPosition2[] = { -500.0f, 0.0f, 0.0f, 1.0f }; // 光源位置 ( 新增 )

    glLightfv(GL_LIGHT1, GL_POSITION, LightPosition2);

    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient2); // 设置环境光

    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse2); // 设置漫射光

    glLightfv(GL_LIGHT1, GL_SPECULAR, Lightspecular2);//设置镜面反射光

                                                      //设置光源的属性3

    GLfloat LightAmbient3[] = { 0.0f, 0.0f, 1.0f, 1.0f }; //环境光参数 ( 新增 )

    GLfloat LightDiffuse3[] = { 0.0f, 0.0f, 1.0f, 1.0f }; // 漫射光参数 ( 新增 )

    GLfloat Lightspecular3[] = { 0.0f, 0.0f, 1.0f, 1.0f }; // 镜面反射

    GLfloat LightPosition3[] = { -500.0f, 500.0f, -500.0f, 1.0f }; // 光源位置 ( 新增 )

    glLightfv(GL_LIGHT2, GL_POSITION, LightPosition3);

    glLightfv(GL_LIGHT2, GL_AMBIENT, LightAmbient3); // 设置环境光

    glLightfv(GL_LIGHT2, GL_DIFFUSE, LightDiffuse3); // 设置漫射光

    glLightfv(GL_LIGHT2, GL_SPECULAR, Lightspecular3);//设置镜面反射光    

                                                      //  初始化材料特性

    GLfloat mat_specular[] = { 1.0, 0.5, 0.3, 1.0 };

    GLfloat diffuseMaterial1[] = { 1.0, 0.5, 0.8, 1.0 };

    GLfloat diffuseMaterial2[] = { 0.5, 0.0, 1.0, 1.0 };

    GLfloat diffuseMaterial3[] = { 0.0, 0.0, 1.0, 1.0 };

    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial1);

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

    glMaterialf(GL_FRONT, GL_SHININESS, 25.0);

    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

    glEnable(GL_LIGHT1);

    glEnable(GL_LIGHT2);

    glutSolidTeapot(0.4);

    glFlush();

}

//视口调整子程序

void myView(int w, int h)

{

    glViewport(0, 0, (GLsizei)w, (GLsizei)h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

3,使用opengl函数完成一个图形动画程序,显示一个 球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。

代码

float dIst = 0.0f;

float dIst1 = 0.0f;

void RenderScene(void)

{

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜和深度缓冲区。

    glPushMatrix();//将当前矩阵压入堆栈

    glColor3ub(255, 0, 0);//设置当前颜色为红色。

                          //glutSolidSphere(0.1f, 50, 50);        //tai yang。

    glPushMatrix();//将当前矩阵压入堆栈

    glRotatef(dIst * 0, 0.0f, 0.0f, 1.0f);    //所画物体绕经过(0,0,0),(1,1,3)的矢量逆时针旋转dIst的角度。

    glTranslatef(dIst - 1, 0.1*sin(dIst * 10) - 0.5, 0.0f);        //将所化物体沿X轴平移10个单位。

    glColor3ub(255, 0, 0);//设置当前颜色为红色。

    glutSolidSphere(0.09f, 50, 50);        //画一个实心圆。

    glPopMatrix();//弹出先前所压矩阵

    glPushMatrix();//将当前矩阵压入堆栈

                   //坐标系绕x轴旋转 

    glRotatef(-30, 1.0f, 0.0f, 0.0f); 

    glRotatef(20, 0.0f, 1.0f, 0.0f);

    //glRotatef(dIst*0, 0.0f, 0.0f, 1.0f);    //所画物体绕经过(0,0,0),(1,1,3)的矢量逆时针旋转dIst的角度。

    glTranslatef(dIst - 1, (dIst - 1)*(dIst - 1), 0.0f);            glColor3ub(255, 0, 0);//设置当前颜色为红色。

    glutWireCube(0.2);        //画一个立方体

    glPopMatrix();//弹出先前所压矩阵

    glPopMatrix();//弹出先前所压矩阵

    dIst += 0.01;

    if (dIst > 2.0f)

        dIst = 0.0f;

    glFlush();

    glutSwapBuffers();//在双缓冲模式下进行一次缓冲区交换。

}

void TimerFunction(int value)

{

    glutPostRedisplay();//刷新当前窗口

    glutTimerFunc(10, TimerFunction, 1);

}

void main(void)

{

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);    glutInitWindowSize(760, 760);

    glutInitWindowPosition(0, 0);

    glutCreateWindow("ex303");

    glutDisplayFunc(RenderScene);

    glutTimerFunc(30, TimerFunction, 1); 

    glutMainLoop();

}

五、实验分析与讨论

1.了解了简单的动画制作过程;

2.掌握了 OpenGL中的三维图形的制作

教师评语:

签名:

日期:

成绩:
 下载本文
显示全文
专题