一、实验目的
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中的三维图形的制作 | |
| 教师评语: 签名: 日期: | 成绩: |