计算机图形学大作业报告.docx
《计算机图形学大作业报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学大作业报告.docx(37页珍藏版)》请在冰豆网上搜索。
![计算机图形学大作业报告.docx](https://file1.bdocx.com/fileroot1/2023-1/25/46f85139-a830-4ef0-89e3-ffcb1362a93b/46f85139-a830-4ef0-89e3-ffcb1362a93b1.gif)
计算机图形学大作业报告
云南大学软件学院期末课程报告
FinalCourseReport
SchoolofSoftware,YunnanUniversity
个人成绩
序号
学号
姓名
成绩
1
学 期:
2009年秋季学期
课程名称:
计算机图形学
任课教师:
实践题目:
创建旋转体
小组长:
联系电话:
电子邮件:
2009-2010学年上学期计算机图形学成绩考核表
年级:
专业:
软件工程学号:
姓名:
本人所做工作:
指标内容
分值
指标内涵及评估标准
得分
技术路线的可行程度
10
合理可行,具体且有创新
合理可行,具体
基本合理可行
不够合理或不够具体
程序或系统设计思路
10
程序或系统思路非常清晰、运行正确
程序或系统思路基本清晰、运行正确
程序或系统思路清晰、环境配置错误无法运行
程序或系统思路不清晰,程序无法运行
小组成员的工作量(每个人分别打分)
15
高出平均要求工作量的15%以上
高出平均要求工作量
达到平均要求工作量
低于平均要求的工作量
理论知识应用水平
15
用理论知识对程序设计方法、思路和代码进行详尽、准确地分析和总结
用理论知识对程序设计方法、思路和代码进行较准确地分析和总结
理论知识应用一般
理论知识差
达到预期目标的程度
10
完全达到
基本达到
无法预见
未能达到
团队合作精神
10
很强的团队合作精神
合作情况良好
合作情况一般
合作不好,各自为政
报告撰写质量
(30分)
5
报告非常完整
报告比较完整
完整程度一般
报告不完整
5
逻辑结构清晰
逻辑组织较好
逻辑组织一般
逻辑不清
5
内容非常丰富
内容较丰富
内容一般
内容欠缺
5
文字表达非常好
文字表达较好
文字表达一般
文字表达差,意思不明了
5
图表制作非常专业化
图件制作良好
图件制作一般
图件制作效果差
5
整体效果很好
整体效果良好
整体效果一般
整体效果差
综合得分
(满分100分)
评语
创建旋转体总结报告(GB8567——88)
1.引言
1.1.编写目的
本学期计算机图形学课程期末大作业二人小组主要的开发项目就是基于OpenGL的旋转体实现,实现语言VC++,编辑、调试环境VS2008,在学期末终于基本开发完成。
是对自我工作的检验和测试,在撰写报告的过程中能够更深刻的了解计算机图形学的理念通过这份文档来记录我们在开发此软件的过程中遇到的问题以及改善的方法。
现在对整个开发过程加以认识、记录和总结,留下经验,汲取教训。
为以后的其他工作留下经验资料,为以后遇到相同的问题和从事类似项目奠定坚实的基础,以便以后有资可寻、有底可查,增长个人见识,为自己程序开发方面的成长而努力奋斗。
并作为期末向指导老师报告的材料。
通过此次大作业的编写,我要达到进一步熟悉OpenGL编程的目的,并在以后的学习中得到总结。
1.2背景
计算机图形学(ComputerGraphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。
从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。
计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。
为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。
所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。
事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。
同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
图形与图像两个概念间的区别越来越模糊,但还是有区别的:
图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等
OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间进行移植。
因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。
由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。
但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组
计算机图形学(ComputerGraphics)是近三十年来发展迅速,应用广泛的新兴学科,主要研究怎样用数字计算机生成、处理和显示图形。
图形的具体应用范围很广,但是从基本的处理技术看只有两类,一类是线条,如工程图、地图、曲线图表等;另一类是明暗图,与照片相似。
为了生成图形,首先要有原始数据或数学模型,如工程人员构思的草图,地形航测的判读数据,飞机的总体方案模型,企业经营的月统计资料等等。
这些数字化的输入经过计算机处理后变成图形输出。
可以说计算机图形学在当代社会的运用已经涉及到了各个领域上的运用,无论在什么领域上计算机图形学都发挥到了自己的作用;计算机图形学以其对图像的专业处理技术,对图形图像的加工运用,实现图形的立体转化,三维立体图形的旋转变形,由平面图到三维立体图的转化等等,都是命了计算机图形学强大的图像处理技术。
说明:
a.本项目的名称为“计算机图形学期末大作业”,开发出来的项目名称为“旋转体功能图”。
b.此软件为2009年秋季学期云南大学软件学院计算机图形学期末大作业最终报告,编写者为原飞、陈博文。
1.3定义
计算机图形学:
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及计算机动画、自然景物仿真、虚拟现实等。
OpenGl:
用于编写计算机图形学的程序的编译工具。
OpenGL是行业领域中最为广泛接纳的2D/3D图形API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。
OpenGL是独立于视窗操作系统或其它操作系统的,亦是网络透明的。
在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™帮助程序员实现在PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OPENGL的功能及特点:
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与VisualC++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。
它具有七大功能:
旋转体:
一条平面曲线绕着它所在的平面内的一条定直线旋转所形成的曲面叫作旋转面;封闭的旋转面围成的几何体。
旋转矩阵:
在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。
旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。
所有旋转加上反演形成了正交矩阵的集合。
旋转变换:
简称旋转.欧氏几何中的一种重要变换.即在欧氏平面上(欧氏空间中),让每一点P绕一固定点(固定轴线)旋转一个定角,变成另一点P′,如此产生的变换称为平面上(空间中)的旋转变换.。
变换矩阵:
在线性代数中,线性变换能够用矩阵表示。
如果T是一个把R映射到R的线性变换,且x是一个具有n个元素的列向量,
,那么我们把m×n的矩阵A,称为T的变换矩阵。
3D坐标系:
三维笛卡儿坐标系是在二维笛卡儿坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。
2D坐标系:
在同一个平面上互相垂直且有公共原点的两条数轴构成平面直角坐标系。
1.4参考资料
a.计算机图形学,项志钢,清华大学出版社,第1版,2006年12月;
b.软件文档国家标准(GB8567-88);
c.属于本项目的其他已发表的文件;
d.OpenGL编程手册;
e.VC++编程手册;
2实际开发结果
2.1产品
1 系统需求分析
1.一个旋转体由其外轮廓线绕其竖直中心轴旋转而成。
2.程序要求建立一个窗口显示竖直的中心轴,并且要求实现轮廓线的编辑,具体包含功能:
节点的增加、删除和节点间自动连线。
3.程序要求建立另外一个窗口显示轮廓线绕中心轴旋转以后的三维物体,本窗口还要求实现三维物体的Phong着色和对三维物体的简单操作,具体包含:
放大、缩小和旋转。
4.移动光源
5.纹理映射效果
6.雾化效果
7.轮廓线使用样条技术
2总体设计
1项目规划:
本系统是一个基于OpenGL开发的实现能够进行人机交互的绘制3D旋转体的系统,本系统中的功能模块主要分为以下几种:
矩阵运算模块:
实现两个或多个矩阵的相关运算,为绘制图形提供数据结构,体现图形转化过程中的算法。
显示图形模块:
用于设定图像的显示方式,绘制方法,在其中还可以设置光源位置等相关的显示信息。
键盘敲击模块:
对不同的键盘敲击事件作出相应的处理,包括点线的转化,雾化效果等。
鼠标点击模块:
在3D显示窗口添加的鼠标事件,对鼠标的事件作出相应的响应效果。
动作模块:
根据左边用户绘制的2D图形,动态的划出右面相对应的3D图像。
找点模块:
在左边的用户画图窗口进行锁定鼠标点击时靠近的点。
2系统功能结构
3设计目标
本系统是根据课本中的程序而开发的,基本能够实现需求中所要求的功能,通过本系统可以达到以下目标:
1系统运行稳定,安全可靠。
2界面美观、友好。
3用户操作使用方便。
4生成的3D图形效果良好。
5能够正确的生成用户所要绘制的3D图形
3主要功能模块设计
1矩阵运算模块的设计:
功能描述:
程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。
代码设计:
floatvv(float*v1,float*v2){
returnv1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
}
voidvxv(float*n,float*v1,float*v2){
n[0]=v1[1]*v2[2]-v1[2]*v2[1];
n[1]=v1[2]*v2[0]-v1[0]*v2[2];
n[2]=v1[0]*v2[1]-v1[1]*v2[0];
}
voidloadIdentity(Matrixm){
Matrixidentity={{1.0,0.0,0.0,0.0},
{0.0,1.0,0.0,0.0},
{0.0,0.0,1.0,0.0},
{0.0,0.0,0.0,1.0}};
for(inti=0;i<4;i++)
for(intj=0;j<4;j++)
m[i][j]=identity[i][j];
}
voidpreMultiply(Matrixp,Matrixm){
inti,j;
Matrixt;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
t[i][j]=p[i][0]*m[0][j]+p[i][1]*m[1][j]+p[i][2]*m[2][j]+p[i][3]*m[3][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
m[i][j]=t[i][j];
}
2显示图形模块的设计:
功能描述:
该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。
代码设计:
//2D图形的display函数
voiddisplay(){
glClear(GL_COLOR_BUFFER_BIT);
if(n==1&&type==GL_LINE_STRIP){
glBegin(GL_POINTS);
glVertex2iv(vert[0]);
glColor3f(0,0.5,0.5);
glVertex2i(width-vert[0][0]-1,vert[0][1]);
glEnd();
}
glColor3f(0,0.5,0.5);
glBegin(GL_LINES);
glVertex2i(width/2,0);
glVertex2i(width/2,height-1);
glEnd();
glBegin(type);
for(inti=0;iglEnd();
glColor3f(1,1,0);
glBegin(type);
for(inti=0;iglEnd();
glutSwapBuffers();
initQMesh();
glutSetWindow(winid);
glutPostRedisplay();
}
//3D图形的显示函数
voidmodelDisplay(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
floatM[16];
for(intr=0;r<4;r++)for(intc=0;c<4;c++)M[4*c+r]=CRM[r][c];
glMultMatrixf(M);
glScalef(zoom,zoom,zoom);
drawQMesh();
glPopMatrix();
glPushMatrix();
glLightfv(GL_LIGHT0,GL_AMBIENT,amb);
glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);
glPopMatrix();
glutSwapBuffers();
}
3键盘敲击模块
功能描述:
该功能主要为两个窗体添加键盘敲击事件,在2D窗体中主要添加了反走样效果,清除所画的图,点线转化功能,对于3D窗体主要添加了投影方式的变换,雾化效果,光源移动的功能
代码设计:
//2D绘制窗体的键盘敲击处理函数
voidkeyboard(unsignedcharkey,intx,inty){
switch(key){
case'a':
antialiasing=!
antialiasing;//反走样效果
if(antialiasing){
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
}else{
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
}
break;
case'c':
n=0;break;//清除界面功能
case'l':
type=GL_LINE_STRIP;break;//绘制线功能
case'v':
type=GL_POINTS;break;//绘制点功能
}
glutPostRedisplay();
}
//3D显示窗体的键盘敲击事件处理函数:
voidmodelKeyboard(unsignedcharkey,intx,inty){
switch(key){
case'o':
glMatrixMode(GL_PROJECTION);//正投影
glLoadIdentity();
glOrtho(-4,4,-4,4,6,14);
glMatrixMode(GL_MODELVIEW);
break;
case'p':
glMatrixMode(GL_PROJECTION);//侧投影,不过是默认的
glLoadIdentity();
gluPerspective(45.0,1.0,6.0,14.0);
glMatrixMode(GL_MODELVIEW);
break;
case'm':
lightPosition[0]=lightPosition[0]-0.5;//光源移动
break;
case'n':
lightPosition[1]=lightPosition[1]-0.5;
break;
case'z':
lightPosition[2]=lightPosition[2]-0.5;
break;
case'q':
glEnable(GL_FOG);//雾化效果
{
glFogi(GL_FOG_MODE,GL_LINEAR);
GLfloatfogColor[]={1.9,1.1,2.2,0.5};
glFogfv(GL_FOG_COLOR,fogColor);
glFogf(GL_FOG_START,3.0);
glFogf(GL_FOG_END,15.0);
glHint(GL_FOG_HINT,GL_DONT_CARE);
}
break;
case'k':
glDisable(GL_FOG);
break;
}
glutPostRedisplay();
}
4鼠标点击模块
功能描述:
该功能模块主要实现了对两个窗体鼠标事件的处理,对于3D窗体实现了鼠标左键旋转,由键放大缩小的效果,2D窗体实现了左键画点,右键可以对已经存在的点改变它的位置。
代码设计:
//3D窗体的鼠标事件
voidmodelMouse(intbutton,intstate,intx,inty){
switch(button){
caseGLUT_LEFT_BUTTON:
if(state==GLUT_DOWN){
cx=x;
cy=h-1-y;
dx=dy=0;
left_button_down=true;
}else
left_button_down=false;
break;
caseGLUT_RIGHT_BUTTON:
if(state==GLUT_DOWN){
cx=x;
cy=h-1-y;
right_button_down=true;
}else
right_button_down=false;
break;
}
}
//2D窗体鼠标事件
voidmouse(intbutton,intstate,intx,inty){
y=height-1-y;
switch(button){
caseGLUT_LEFT_BUTTON:
if(state==GLUT_DOWN&&!
rubberbanding){
v=n++;
vert[v][0]=(xwidth/2:
(x>=width)?
width-1:
x;
vert[v][1]=(y<0)?
0:
(y>=height)?
height-1:
y;
rubberbanding=true;
glutPostRedisplay();
}
elserubberbanding=false;
break;
caseGLUT_RIGHT_BUTTON:
if(state==GLUT_DOWN&&!
rubberbanding&&(v=findVertex(x,y))!
=-1){
if(glutGetModifiers()==GLUT_ACTIVE_CTRL){
for(inti=v;ivert[v][0]=vert[i+1][0];
vert[i][1]=vert[i+1][1];
}
n--;
}else{
vert[v][0]=(xwidth/2:
(x>=width)?
width-1:
x;
vert[v][1]=(y<0)?
0:
(y>=height)?
height-1:
y;
rubberbanding=true;
}
glutPostRedisplay();
}
elserubberbanding=false;
break;
}
}
5找点模块
功能描述:
此方法主要用于对用户所需要的点进行锁定。
能够改变原来已经存在的点。
intfindVertex(intx,inty){//锁定鼠标靠近的点
intdx,dy;
for(inti=0;idx=vert[i][0]-x;
dy=vert[i][1]-y;
if(dx*dx+dy*dy<16)returni;
}
return-1;
}
2.2主要功能和性能
逐项列出本软件产品所实际具有的主要功能和性能,对照可行性研究报告、项目开发计划、功能需求说明书的有关内容,说明原定的开发目标是达到了、未完全达到、或超过了。
a.通过Editpolygons窗口(二维多边形编辑视窗)绘制多边形。
b.对绘制出的多边形能增删顶点改变多边形形状。
c.通过Object