计算机图形学实验报告二.docx
《计算机图形学实验报告二.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告二.docx(18页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告二
《计算机图形学》实验报告
一、实验目的
1、使用opengl函数写一个控制台程序,要求输出一些简单的三维图形,包括:
球体、圆锥、立方体、茶壶等。
2、使用opengl函数写一个程序,要求实现对一个图形的平移、旋转和缩放的处理
3、使用opengl函数写一个控制台程序,要求实现对鼠标、键盘、窗口缩放等事件的处理。
4,在显示窗口的左下1/4处显示一个球的1/2.
二、实验要求
1.掌握Window图形编程的基本方法;
2.使用opengl编写控制程序
3.掌握如何进行图形变化
三、实验设备(环境)
Windows系统,vs2017
四、实验内容与步骤
1、使用opengl函数写一个控制台程序,要求输出一些简单的三维图形,包括:
球体、圆锥、立方体、茶壶等。
圆锥:
代码:
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(0.0,1.0,0.0);//绿色绘制
glEnable(GL_DEPTH_TEST);//深度缓冲区
glutWireCone(2.5,3,30,4);//绘制圆锥
glFlush();
glutSwapBuffers();
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//将当前矩阵指定为投影模式
glLoadIdentity();
gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,20);//创建透视投影矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,5,5,0,0,0,0,-1,0);//观测点
}
茶壶
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(0.0,1.0,0.0);//绿色绘制
glEnable(GL_DEPTH_TEST);//深度缓冲区
glutWireTeapot
(2);//绘制茶壶
glFlush();
glutSwapBuffers();
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//将当前矩阵指定为投影模式
glLoadIdentity();
gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,20);//创建透视投影矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,5,5,0,0,0,0,1,0);//观测点
}
球
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(0.0,1.0,0.0);//绿色绘制
glEnable(GL_DEPTH_TEST);//深度缓冲区
glutWireSphere(1,20,16);//绘制球体
glFlush();
glutSwapBuffers();
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//将当前矩阵指定为投影模式
glLoadIdentity();
gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,20);//创建透视投影矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,3,3,0,0,0,1,1,0);//观测点
}
立方体
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(0.0,1.0,0.0);//绿色绘制
glEnable(GL_DEPTH_TEST);//深度缓冲区
glutWireCube(3);//绘制立方体
glFlush();
glutSwapBuffers();
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//将当前矩阵指定为投影模式
glLoadIdentity();
gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,20);//创建透视投影矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,5,5,0,0,0,1,1,0);//观测点
}
2、使用opengl函数写一个程序,要求实现对一个图形的平移、旋转和缩放的处理
以茶壶为例进行
voidreshape(intw,inth)
{
if(h==0)h=1;
GLfloataspect=(GLfloat)w/(GLfloat)h;
GLfloatnRange=100.0f;
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//将当前矩阵指定为投影模式
glLoadIdentity();
if(w<=h)
{
glOrtho(-nRange,nRange,-nRange*aspect,nRange*aspect,-nRange,nRange);
}
else
{
glOrtho(-nRange,nRange,-nRange/aspect,nRange/aspect,-nRange,nRange);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
3、使用opengl函数写一个控制台程序,要求实现对鼠标、键盘、窗口缩放等事件的处理。
原图
数字键4、5、6控制视角向X、Y、Z正方向移动;
case'4':
xDirection+=0.5;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(65,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xDirection,yDirection,zDirection,0,0,0,0,1,0);
glutPostRedisplay();
break;
case'5':
yDirection+=0.5;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(65,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xDirection,yDirection,zDirection,0,0,0,0,1,0);
glutPostRedisplay();
break;
case'6':
zDirection+=0.5;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(65,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xDirection,yDirection,zDirection,0,0,0,0,1,0);
glutPostRedisplay();
break;
数字键1、2、3控制视角向X、Y、Z负方向移动;
case'1':
xDirection-=0.5;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(65,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xDirection,yDirection,zDirection,0,0,0,0,1,0);
glutPostRedisplay();
break;
case'2':
xDirection-=0.5;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(65,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xDirection,yDirection,zDirection,0,0,0,0,1,0);
glutPostRedisplay();
break;
case'3':
xDirection-=0.5;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(65,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xDirection,yDirection,zDirection,0,0,0,0,1,0);
glutPostRedisplay();
break;
键盘上W、A、S、D键控制模型向上、向左、向下、向右旋转:
voidKeyBoards(unsignedcharkey,intx,inty)
{
switch(key)
{
case'w':
glMatrixMode(GL_MODELVIEW);
glRotatef(angle,-1,0,0);
glutPostRedisplay();
break;
case'a':
glMatrixMode(GL_MODELVIEW);
glRotatef(angle,0,0,-1);
glutPostRedisplay();
break;
case's':
glMatrixMode(GL_MODELVIEW);
glRotatef(angle,1,0,0);
glutPostRedisplay();
break;
case'd':
glMatrixMode(GL_MODELVIEW);
glRotatef(angle,0,0,1);
glutPostRedisplay();
break;
4,在显示窗口的左下1/4处显示一个球的1/2.
//窗口调整子程序
voidmyReshape(intw,inth)
{
glViewport(-200,-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);
}
五、实验分析与讨论
1.掌握了OpenGL中的三维图形的制作
2.了解了图形的简单变换,旋转,缩放等
3.需要一定的数学知识作为铺垫
教师评语:
签名:
日期:
成绩: