《计算机图形学》课程设计实验报告书_第1页
《计算机图形学》课程设计实验报告书_第2页
《计算机图形学》课程设计实验报告书_第3页
《计算机图形学》课程设计实验报告书_第4页
《计算机图形学》课程设计实验报告书_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEi《计算机图形学》课程设计实验报告书目录303111问题描述 2307482问题思路以及分析 2137072.1问题分析 273052.2三维对象多边形 353472.3多边形数据表 3169663问题的解决 5234174总结 515804参考文献 56029附录:解决代码 5PAGE81问题描述3.25编写一个为定义三维对象表面的多边形面片而输入的任意点集建立几何数据表的过程。2问题思路以及分析2.1问题分析 本课程设计的主要任务是是通过观察一个三维的对象的建立,通过输入的任意点集建立一个几何数据表的过程。场景中的对象一般用一组多边形面片来描述。实际上,图形软件包经常提供一多边形网格形式描述表面形状的函数。 在mathematica中,多边形的生成是直接用的顶点坐标结合适当的函数比如Graphics3D、Listplot3D来完成的。比如由点集(3,5,4),(7,5.5,5)和(6.5,9,3)获得的三维多边形面片。 P={{3,5,4},{7,5.5,5},{6.5,9,3}} Graphics3D[{Line[{P[[{1,2,3,1}]]}]}] 多边形面片通过点集和函数直接得到,没有或者我是在不了解通过建立三维面片的多边形数据表的函数。猜想这算是一种相对低级的算法实现,Mathematica的绘图函数可能就是使用这种算法。 猜想可能不是用mathematica完成这个过程,所以开始的思路就不对,一直困扰。查询相关资料,查到可以用底层一点的编程软件,如VC++下完成这个过程。自己并没有学过C++,所以附件程序大部分取自资料查询,但是关于整个过程建立几何数据表的过程,在本课程设计已经完整体现。过程: 建立顶点表建立边表建立多边形表2.2三维对象多边形 场景中的对象一般用一组多边形面片来描述。如下图所示。·多面体。多边形表示精确地描述了物体的表面特征。·其它物体。表面嵌入到物体生成一个多边形网格逼近。图形软件包一般使用多边形网格形式描述表面形状,常用的多边形网格有:角形带和四边形网格,如图下图所示。个顶点产生n-2个三角形,n*m顶点产生(n-1)*(m-1)个四边形。2.3多边形数据表对每一个对象的描述包括指定多边形面片的几何信息和其他表面参数。在输入多边形的信息时,数据放进一些表格中等待后续处理。多边形数据表可分为两组来组织:几何表和属性表。几何表包括顶点坐标和用来标识多边形平面空间方向的参数;属性表包括指明物体透明度及表面反射度的参数和纹理特征。存储几何数据的一个有效方法是建立3张表:顶点表、边表和多边形表。

为上图所示的四面体建立的三张表如下:顶点表:保存顶点坐标值。边表:保存指向顶点表的指针,为每条边标识顶点。多边形表:保存指向边表的指针,为每个多边形标识边。3问题的解决给每个顶点,每边,每个多边形面分配坐标。为顶点的位置建立坐标表示,然后进入边缘的顶点表坐标系,以及引用每个边的两个顶点,进入边表;以及参考每个小面的边缘,进入面表。一致性检查以确保每边有两个坐标参考,每个小面的边缘引用正确的编码(三边一个三角形,四边一个四边形,等等),和多边形面片形式在对象封闭曲面的内部。同时,应符合表没有信息是重复的,所有的顶点是边的端点,和所有的边缘出现在两个表面的交面。这里采用通过点集,建立三角形面片,进而建立一个四面体。这里假设点集为A{3,5,4},B{7,5.5,5},C{6.5,9,3},D{0,0,0}建立顶点表,边表,三角形面表:顶点表边表三角形面表A{3,5,4}AB{4,0.5,1}ABCAB,BC,CAB{7,5.5,5}BC{-0.5,3.5,-1}ABDAB,BD,DAC{6.5,9,3}CD{-6.5,-9,-3}BCDBC,CD,DBD{0,0,0}AD{-3,-5,-4}ACDAC,CD,DABD{-7,-5.5,-5}CD{-6.5,-9,-3}4总结在这次课程设计的重写过程中,确实认识到自己上学期期末因为多门课程的复习,导致课程设计上投入精力太少,很多地方属于互评乱凑,导致课程设计根本没有实质上解决掉老师所布置的问题。已经通过重新学习重新查资料,以自己现有的理解解决了这个问题。最重要的是认识到做任何事情都不能马虎,切莫因小失大。参考文献[1]《计算机图形学(第三版)》DonaldHearn、M.PaulineBaker主编中国科学技术大学出版社2008 [2]《计算机图形学》课件 侯为根老师附录:解决代码Mathematica下建立三维多边形面片以及一个四面体:P={{3,5,4},{7,5.5,5},{6.5,9,3}}Graphics3D[{Line[{P[[{1,2,3,1}]]}]}]PP={{3,5,4},{7,5.5,5},{6.5,9,3},{0,0,0}}Graphics3D[Polygon[Subsets[P,{3}]]]C++下建立一个四面体:#include<gl/glut.h>

#defineWIDTH400

#defineHEIGHT400

#include<math.h>

#defineColoredVertex(c,v)do{glColor3fv(c);glVertex3fv(v);}while(0)

GLfloatangle=0.0f;//设定转角

voidmyDisplay(void)//绘图函数

{

staticintlist=0;

if(list==0)

{

//如果显示列表不存在,则创建

GLfloat//GLfloat为OpenGL用到的数据类型,与C的float基本一致

PointA[]={0,0,0},//此处为4个顶点的坐标,因为时3D坐标系下的,所以每个坐标有3个分量,分别对应X,Y,Z轴。至于各轴方向定义……默认下屏幕水平为X,竖直为Y,里外为Z。

PointB[]={3,5,4},

PointC[]={7,5.5,5},

PointD[]={6.5,9,3};

GLfloat

ColorR[]={1,0,0},//定义颜色数组,每个数组为一个颜色,也含有3个分量,对应红,绿,蓝,分量范围[0,1],每种颜色都可看做是这3个颜色混合得到。可一自己改变下其中的数值看看具体效果。

ColorG[]={0,1,0},

ColorB[]={0,0,1},

ColorY[]={1,1,0};

list=glGenLists(1);

glNewList(list,GL_COMPILE);//创建一个顶点表,这个表里包含有绘图的顶点信息

glBegin(GL_TRIANGLES);//开始绘图,(GL_TRIANGLES)表示绘制三角形

//平面ABC

ColoredVertex(ColorR,PointA);//以颜色R绘制点A,以下类推,ColoredVertex()函数在程序开头定义了。

ColoredVertex(ColorG,PointB);

ColoredVertex(ColorB,PointC);

//平面ACD

ColoredVertex(ColorR,PointA);

ColoredVertex(ColorB,PointC);

ColoredVertex(ColorY,PointD);

//平面CBD

ColoredVertex(ColorB,PointC);

ColoredVertex(ColorG,PointB);

ColoredVertex(ColorY,PointD);

//平面BAD

ColoredVertex(ColorG,PointB);

ColoredVertex(ColorR,PointA);

ColoredVertex(ColorY,PointD);

glEnd();

glEndList();//结束绘图结束绘图顶点表。

glEnable(GL_DEPTH_TEST);//打开深度测试。打开深度测试的作用是:如果在场景中有多个物体,而它们相对观察者的距离不同(简单理解为远近),那么这个时候,前面的物体则可以挡住后面的物体(没错吧),使场景具有深度感。如果不打开深度测试,那么绘图会按绘制的顺序,后绘制的物体覆盖住现绘制的物体。这里要注意的是,深度仅影响物体重合时谁显示谁不显示,并不影响其3D效果,远处的物体仍然会变“小”,物体在空间中的位置仍为三维的。

}

//已经创建了显示列表,在每次绘制正四面体时将调用它

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存

glPushMatrix();//绘图坐标系入栈,可以简单理解为存下了这次画图时画笔的起始位置

glRotatef(angle,1,0.5,0);//绘图坐标系绕(1,0.5,0)轴旋转angle角,可理解为模型绕该轴旋转angle角。

glCallList(list);//调用顶点表,绘制四面体模型

glPopMatrix();//绘图坐标系出栈,则回到了刚才的绘图起始位置

glutSwapBuffers();//使用双缓存(第一个在前面显示模型,另一个在后面绘制新的模型,当新模型绘制完毕后送给第一个缓存显示。这样不会出现模型上一些点已经绘制完了,而另一些点还在绘制的情况。)

}

voidmyIdle(void)

{

++angle;

if(angle>=360.0f)

angle=0.0f;//转角超过360度,将其置零。

myDisplay();//绘制模型}

intmain(intargc,char*argv[]){glutInit(&argc,argv);//创建绘图窗口

glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);//设置绘图模式

glutInitWindowPo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论