1 网格数据应用
- 渲染
- 集合查询(某个面的顶点有哪些,两个点是否相连等)
- 几何操作(添加、删除某个点/线/面;网格化简;顶点分裂,边缘折叠)
2 网格数据的存储
- 一般的网格存储(很难有效实现)
- 什么是好的数据存储?(空间复杂度,时间(构建时间,查询时间,修改时间),时间空间的权衡,冗余)
3 定义一个网格
- 几何上(顶点坐标)
- 连通
- 表面及材料属性(材料颜色Material color,周围环境Ambient,高光系数hightlight coefficients,纹理坐标Texture coordinates,双向反射分布函数BRDF,双向纹理函数BTF)
- 渲染属性(光照,法向,渲染模型)
4 常用网格文件
- wavefont OBJ(*.obj),
- 3D Max (*.max, *.3ds),
- VRML(*.vrl),
- nventor (*.iv),
- PLY (*.ply, *.ply2),
- User‐defined(*.m, *.liu)
5 边表
优点:方便快捷,可以表示非流形网格
缺点:太简单,不能表达边和点之间的关系
6 邻接矩阵
- 将网格看成连通图
- 对给定的n个点,构造一个n*n的邻接矩阵,如果点i和点j相连则(i,j)的值为true
- 几何信息(点的坐标)
- 添加一个面:顶点指标三元组(v1,v2,v3)
优点:1、存储了点之间的连通性;2、可以存储非流性网格
缺点:有面对点的联系,没有点对面的联系
7 双连通边表(DCEL)
记录每一个面,每一条边,每一个点(几何信息,拓普信息,属性信息),半边结构
- 点记录:点v的坐标;指向以点v作为起点的半边的的指针
- 面记录:指向面f边界的半边的指针
- 边记录:指向边e起始点的指针origin(e);指向他的双胞胎半边的指针twin(e);指向该边左边的面的指针IncFace(e);IncFace(e)的上一条边prev(e)和下一条边next(e);
例子:
优点:所有的查询时间复杂度都为O(1);通常情况下,所有的操作时间复杂度都为O(1)。
缺点:只能表示流型网格
8 角表(Corner Table)
角c包含的信息有:
- c.t:角c所在的三角形
- c.v:角c所对的点
- c.n:c.t中角c逆时针方向的下一个角
- c.p:c.t中角c逆时针方向的上一个角
- c.o:与c相对的角
- c.r:角c右边的角 == c.n.o
- c.l:角c左边的角 == c.p.o
例子:
优点:所有的查询时间复杂度都为O(1);通常情况下,所有的操作时间复杂度都为O(1)。
缺点:只能表示流型网格;高冗余(但可以接受)