计算机图形学实验几何物体的表示——三角网格的表示与显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四几何物体的表示——三角网格的
表示与显示
1.实验目的
●熟悉三角网格的表示
●熟悉三角网格的显示
●熟悉纹理的显示
2.实验内容
●设计三角网格的数据结构
●解析Obj文件格式的三角网格
●显示三角网格及纹理贴图
3.实验指导
存储三角网格数据的文件格式多种多样,常见的文件格式有:
●Wavefront OBJ (*.0bj)
●3D Max (*.max, *.3ds)
●VRML (*.vrl)
●Inventor (*.iv)
●PLY (*.ply, *,ply2)
本实验主要以OBJ文件为例,了解其数据格式,建立三角网格在内存中的数据结构,从而将文件中的数据读取到内存,并最终显示出来。
3.1OBJ文件格式
OBJ文件是Alias|Wavefront公司为他的一套基于工作站的3D建模和动画软件“Advanced Visualizer”开发的一种标准3D模型文件格式,很适合用于3D软
件模型之间的数据交换。目前几乎所有知名的3D软件如3dsMax,LightWave,Maya都支持OBJ文件的读写。
OBJ文件是一种纯文本文件,可以直接用写字板打开进行查看和编辑修改。这种文件以纯文本的形式存储了模型的顶点、法线和纹理坐标和材质使用信息。OBJ的每一行,都有极其相似的格式,每行的格式如下:
其中,前缀标识了这一行所存储的信息类型,参数则是具体的数据。OBJ文件的前缀可以有:
面的格式说明:
每个三角面片的数据由f开头,后面跟组成该三角面片的各顶点的顶点坐标索引,纹理坐标索引,顶点法向索引,其格式为:
f 顶点坐标索引/纹理坐标索引/顶点法向索引……
其中纹理坐标索引和顶点法向索引可以为空,如果为空的索引位于末尾时,’/’也可以省略,例如:
f 1 2 3
这样的行表示以第1、2、3号顶点组成一个三角形,等同于1// 2// 3//。
f 1/3 2/5 3/4
这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,第二个顶点的纹理坐标的索引值为5,第三个顶点的纹理坐标的索引值为4。
f 1/3/4 2/5/6 3/4/2
这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4;第二个顶点的纹理坐标的索引值为5,其法线的索引值是6;第三个顶点的纹理坐标的索引值为6,其法线的索引值是2。
f 1//4 2//6 3//2
这样的行表示以第1、2、3号顶点组成一个三角形,且忽略纹理坐标。其中第一个顶点的法线的索引值是4;第二个顶点的法线的索引值是6;第三个顶点的法线的索引值是2。
除此之外,以“#”开头的表示注释,以g开头的表示组的前缀。但这些前缀并不影响模型的外观,因此我们可以忽略它们。
下面来看一个具体的实例,该文件是用3dsMax创建的一个长方体存储成OBJ 文件的结果:
Obj格式对纹理的支持则是通过关键字mtllib指定的。从上述例子可以看出,mtllib指定了对应于该obj文件的材质文件,材质文件的格式类似于obj的文件格式,也是由关键字前缀+对应的内容组成。
Ka,kd,ks分别指定了物体材质中环境光,漫反射光,镜面光的颜色,map_Kd 指定了纹理图像的路径,通过该纹理图像的路径,可以读取obj文件对应的纹理
图像。
3.2 三角网格的数据结构
三角网格的数据由几何和连接关系两部分组成,几何包括顶点的x ,y ,z 坐标及顶点的法向量等,连接关系即三角网格是如何连在一块的。如图0.1所示。
3
v 1
2v 4
v 6
v f 1f 2f 3f 4e 1e 2
e 3
e 4e 5e 6e 7
e 8
e 9
(a ) (b )
图0.1三角网格数据
常用的三角网格数据结构包括: ● 顶点—边(Vertex-Edge ) ● 顶点—面(Vertex-Face )
● 邻接矩阵(Adjacency matrix )和邻接表(Adjacency List ) ● 顶点—边—面(Vertex-Edge-Face ) ● 半边结构(Half Edge )
在各种数据结构的表示方式中,几何的表示基本一致,可以用链表或者数组的方式加以存储,对于图0.1.a 中的网格,可表示为:
区别的地方主要在于连接关系的存储,不同的存储方式决定了顶点、边、面
的邻接关系的复杂度:
顶点—边(Vertex-Edge)的数据结构只包含边的连接关系,对于图0.1.a中的网格,可表示为:
顶点—面(Vertex-Face)的数据结构只包含面的连接关系,对于图0.1.a中的网格,可表示为:
邻接矩阵(Adjacency matrix)的数据结构以矩阵的方式存储点与点之间的连接关系,对于图0.1.a中的网格,可表示为:
顶点—边—面(Vertex-Edge-Face)的数据结构同时包含了边和面的连接关系,对于图0.1.a中的网格,可表示为:
数据结构的选取,取决于对三角网格所进行的操作,如果需要频繁的对三角面片进行删除和插入的操作,如对三角网格进行简化时,则需要利用链表而非数组的方式来存储顶点的几何信息及连接关系,如果需要频繁的对顶点、边、面的邻接关系进行查询,则需要在避免过多冗余信息的同时,尽可能保存多的邻接关系,使得查询的复杂度为(1)
,如在顶点—边—面(Vertex-Edge-Face)的数据结构中对边的信息增加保存邻接三角形的信息,对顶点增加邻接边的信息。对于图0.1.a中的网格,边的信息变成为:
3.3三角网格的绘制
在OpenGL中,任何复杂的几何物体最终都要描述成一个顶点的有序集合,即使是连续的曲线曲面,也需要首先对这些曲线曲面进行离散化,而后这些有序的顶点集合再组装成基本图元的集合。OpenGL中,基本图元包括点、线段、三角形、多边形,而三角网格即为三角形这种基本图元的集合。
顶点表示:
glVertex{2, 3, 4}{s, i, f, d}[v](坐标)
此函数指定顶点的各个坐标分量。