华北电力大学计算机图形学.docx
- 文档编号:8806429
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:13
- 大小:202KB
华北电力大学计算机图形学.docx
《华北电力大学计算机图形学.docx》由会员分享,可在线阅读,更多相关《华北电力大学计算机图形学.docx(13页珍藏版)》请在冰豆网上搜索。
华北电力大学计算机图形学
华北电力大学
实验报告
|
|
实验名称基于OpenGL的综合实验
课程名称计算机图形学
|
|
专业班级:
学生姓名:
学号:
成绩:
指导教师:
姜丽梅实验日期:
2013年5月
实验一:
OpenGL基本图元绘制实验
1、实验目的
了解OpenGL图形软件包绘制图形的基本过程及其程序框架,本实验要求熟悉OpenGL基本图元函数的使用。
通过使用OpenGL及GLUT库在VisualC++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础。
2、实验要求
在两个具有不同属性的窗口中分别显示一个旋转的三角形来演示单缓存和双缓存,在旋转过程中不断改变图形的颜色,利用鼠标或菜单可终止/启动图形旋转。
3、实验内容
程序包括哪些函数,各个函数的功能以及整个流程。
理解glut程序框架,理解窗口到视区的变换,理解OpenGL实现动画的原理。
4、实验过程与结果分析
1、OpenGL绘图工具箱
1)清理屏幕;
2)属性说明;
3)指定坐标系;
4)定义几何图元;
5)定义视点;
6)说明视口;
7)绘制物体;
8)结束运行。
2.OpenGL绘制流程
3、实验方法与步骤
1、正确配置相关文件;
对于MicrosoftVisualStudio2010
把glut.h放入
1.C:
\ProgramFiles\MicrosoftSDKs\Windows\v7.0A\Include\gl文件目录下
把glut.lib放入
2.C:
\ProgramFiles\MicrosoftSDKs\Windows\v7.0A\Lib文件目录下
把glut32.dll放入
3.C:
\Windows\SysWOW64文件目录下
2、使用Win32ConsoleApplication创建新项目;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;通过改变各个函数参数值,观察图形变化,说明产生相应结果的原因,从而进一步了解函数的作用。
5、对运行结果进行保存;
4、实验运行截图:
当旋转的三角形停在不同的颜色变换的时候
实验代码:
#include
#include
#include
#defineDEG_TO_RAD0.017453
staticGLfloattheta=0.0;
boolFlag=true;
GLfloatrtri;
floatx=0.0;
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(cos(x),sin(x),0.0);
glBegin(GL_POLYGON);
glVertex2f(cos(DEG_TO_RAD*theta),sin(DEG_TO_RAD*theta));
glVertex2f(cos(DEG_TO_RAD*(theta+120)),sin(DEG_TO_RAD*(theta+120)));
glVertex2f(cos(DEG_TO_RAD*(theta+240)),sin(DEG_TO_RAD*(theta+240)));
glEnd();
glFlush();
}
voidspinDisplay(void)
{
theta=theta+1.0;
x++;
if(theta>360.0)
theta=theta-360.0;
glutPostRedisplay();//标记当前窗口需要重新绘制
}
voidmyReshape(intw,inth)
{
glViewport(0,0,w,h);//指定平面上一个矩形裁剪区域,
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
gluOrtho2D(-1.,1.,-1.*(GLfloat)h/(GLfloat)w,1.*(GLfloat)h/(GLfloat)w);
else
gluOrtho2D(-1.*(GLfloat)w/(GLfloat)h,1.*(GLfloat)w/(GLfloat)h,-1.,1.);
}
voidmyMouse(intbutton,intstate,intx,inty)
{
if(Flag==true)
{
if(button==GLUT_LEFT_BUTTON)
{
Flag=false;
Sleep(1000);
}
else
return;
}
elseif(Flag==false)
{
Flag=true;
return;
}
}
voidmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(500,500);
glutCreateWindow("spinningsquare");
glClearColor(0.0,0.0,0.0,1.0);
glutMouseFunc(myMouse);
glutDisplayFunc(display);
glutReshapeFunc(myReshape);
glutIdleFunc(spinDisplay);
glutMainLoop();
}
实验二:
OpenGL三维观察综合实验
一、实验目的
了解OpenGL图形软件包绘制图形的基本过程及其程序框架,本实验要求对绘制的简单场景(可以自己拟定)综合利用几何变换或gluLookAt函数实现交互式三维观察程序,从而通过本实验加深理解计算机图形学中的三维图形绘制流程的工作原理。
二、实验要求
对于绘制的立方体(也可以自己拟定)通过键盘移动视点,利用鼠标或键盘控制立方体的旋转方向,从不同角度观察各面颜色不同的立方体。
三、实验内容
程序包括哪些函数,各个函数的功能以及整个流程。
理解glut程序框架,理解窗口到视区的变换,理解OpenGL实现动画的原理。
4、实验过程与结果分析
1、实验分析
通过改变glOtho2D的参数来得到正确的图形。
这个函数描述了一个平行修剪空间。
这种投影意味着理观察者较远的对象看上去不会变小。
它创建了一个平行视景体,实际上这个函数的操作是创建了一个正射投影矩阵。
其中近裁剪平面是一个矩阵,矩阵左下角点的三维空间坐标是(left,bottom,near)。
对绘制的三维场景综合利用几何变换或gluLookAt函数实现交互式三维观察。
实验运行结果截图:
通过按不同的鼠标键让图形从不同的方向旋转
通过按不同的键盘的键让图形从不同的方向旋转而且改变大小
结果分析
glLookAt()函数定义了视点矩阵,并用该矩阵乘以当前矩阵。
viewer[0],viewer[1],viewer[2]定义了视点的位置,centerxcenterycenterz变量指定了参考点的位置,该点通常为相机所瞄准的场景中心轴线上的点。
视点转换操作在模型转换操作之后发出,以便模型转换先对物体发生作用。
场景中物体的顶点经过模型转换移动到所希望的位置,然后再对场景进行视点定位等操作。
模型转换和视点转换共同构成模型视景矩阵。
实验代码:
#include
#include
GLfloatvertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},
{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};
GLfloatnormals[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},
{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};
GLfloatcolors[][3]={{0.0,0.0,0.0},{1.0,0.0,0.0},
{1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},
{1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}};
voidpolygon(inta,intb,intc,intd)
{
glBegin(GL_POLYGON);
glColor3fv(colors[a]);
glNormal3fv(normals[a]);
glVertex3fv(vertices[a]);
glColor3fv(colors[b]);
glNormal3fv(normals[b]);
glVertex3fv(vertices[b]);
glColor3fv(colors[c]);
glNormal3fv(normals[c]);
glVertex3fv(vertices[c]);
glColor3fv(colors[d]);
glNormal3fv(normals[d]);
glVertex3fv(vertices[d]);
glEnd();}
voidcolorcube()
{
polygon(0,3,2,1);
polygon(2,3,7,6);
polygon(0,4,7,3);
polygon(1,2,6,5);
polygon(4,5,6,7);
polygon(0,1,5,4);
}
staticGLfloattheta[]={0.0,0.0,0.0};
staticGLintaxis=2;
staticGLdoubleviewer[]={0.0,0.0,5.0};/*initialviewerlocation*/
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
/*Updateviewerpositioninmodelviewmatrix*/
glLoadIdentity();
gluLookAt(viewer[0],viewer[1],viewer[2],0.0,0.0,0.0,0.0,1.0,0.0);
/*rotatecube*/
glRotatef(theta[0],1.0,0.0,0.0);
glRotatef(theta[1],0.0,1.0,0.0);
glRotatef(theta[2],0.0,0.0,1.0);
colorcube();
glFlush();
glutSwapBuffers();
}
voidmouse(intbtn,intstate,intx,inty)
{
if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)axis=0;
if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN)axis=1;
if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)axis=2;
theta[axis]+=2.0;
if(theta[axis]>360.0)theta[axis]-=360.0;
display();
}
voidkeys(unsignedcharkey,intx,inty)
{
/*Usex,X,y,Y,z,andZkeystomoveviewer*/
if(key=='x')viewer[0]-=1.0;
if(key=='X')viewer[0]+=1.0;
if(key=='y')viewer[1]-=1.0;
if(key=='Y')viewer[1]+=1.0;
if(key=='z')viewer[2]-=1.0;
if(key=='Z')viewer[2]+=1.0;
display();
}
voidmyReshape(intw,inth)
{
glViewport(0,0,w,h);
/*Useaperspectiveview*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)glFrustum(-2.0,2.0,-2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w,2.0,20.0);
elseglFrustum(-2.0,2.0,-2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h,2.0,20.0);
/*OrwecanusegluPerspective*/
/*gluPerspective(45.0,w/h,-10.0,10.0);*/
glMatrixMode(GL_MODELVIEW);
}
void
main(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("colorcube");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keys);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
5、实验总结
由于初次接触计算机图形学,对于环境的配置比较简单的完成了,由于OpenGl是在VC6.0的环境下开发的所以上手比较简单,初步了解了计算机图形学的基本机制以及OpenGl语言绘制图形的基本框架,能够基本绘制一些基本图元。
对于OpenGl中的基本绘制图形的流程有了一定的理解,由于开始对OpenGl中的一些函数没有了解,不知道如何使用,经过基本图元的绘制知道了如何绘制OpenGl的图形。
通过本次实验,虽然实验过程没有完整编写OpenGL程序代码,但是在老师给出的
程序框架中,通过添加函数及修改相应的函数参数,基本完成了实验内容,并加深理解了OpenGL编程思想及计算机图形绘制的流水线。
通过这短时间的学习以及上机的应用,虽然我还不能够完全应用OpenGL做出自己
希望的图形,但是我相信这种编程思想一定会在未来给我很大帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华北电力 大学计算机 图形学