网格半边结构(Half edge mesh)
一、网格的表示
在计算机图形学上,表达表面网格的数据结构有三种,分别是面列表( List of faces)、邻接矩阵(Adjacency matrix)、半边结构(Half-edge)。git
面列表示例:
github
邻接矩阵示例:
json
半边结构示例:
网络
二、网格分类
流形网格(manifold mesh)
非流形网格(non-manifold mesh)
数据结构
若是网格的每一个边最多被两个面片共用,那么这个网格就是流形网络,不然称为非流形网络。spa
非流形网络例子:
.net
三、网格半边结构(Halfedge)
网格半边结构指针
半边数据结构&网格细分与简化code
doubly connected edge list 或者叫 half-edge data structure。
最大特色是半边,每一个边分为两个半边,每一个半边都是一个有向边,方向相反。若是一个边被两个面片公用,则每一个面片都能各自拥有一个半边。若是一个边仅被一个面片占用(边界边),则这个面片仅拥有该边的其中一个半边,另外一个半边为闲置状态。每一条半边仅存储它的起点指针,半边数据结构仅支持流形网络。边沿逆时针方向朝向每一个面。
orm
四、网格半边结构实例
以一个正方形为例,这是在c4d导出的正方形的.obj文件:
# WaveFront *.obj file (generated by CINEMA 4D) v -50 -50 0 v 50 -50 0 v -50 50 -0 v 50 50 -0 # 4 vertices vn 0 0 1 # 1 normal vt 0 0 0 vt 0 1 0 vt 1 1 0 vt 1 0 0 # 4 texture coordinates f 2/4/1 4/3/1 3/2/1 1/1/1
把顶点和面信息提取出来:
v:表示顶点, [i]表示索引, v[0]就表明顶点第0个。边的表示相似,用e。
{ "verts":[ { "x":-50, "y":-50, "z":0 }, { "x":50, "y":-50, "z":0 }, { "x":-50, "y":50, "z":0 }, { "x":50, "y":50, "z":0 } ], "faces":[ [1,3,2,0] ] }
这个正方形由4个顶点和一个四变形组成。
顶点和边的关系
一共构建了8条边,索引是0~7。逆时针,边拓扑的关系:
e[0]: { prevEage: e[6], nextEage: e[3], vertex: v[3], face: 0} e[1]: { prevEage: -1, nextEage: -1, vertex: v[1], face: -1} e[2]: { prevEage: -1, nextEage: -1, vertex: v[3], face: -1} e[3]: { prevEage: e[0], nextEage: e[5], vertex: v[2], face: 0} e[4]: { prevEage: -1, nextEage: -1, vertex: v[2], face: -1} e[5]: { prevEage: e[3], nextEage: e[6], vertex: v[0], face: 0} e[6]: { prevEage: e[5], nextEage: e[0], vertex: v[1], face: 0} e[7]: { prevEage: -1, nextEage: -1, vertex: v[0], face: -1}
解释第一条:
e[0]这条边: 起始顶点是: v[3] 上一条边是: e[6] 下一条边是: e[3]
构成面的边只有e[0],e[3],e[5],e[6].因此其余边都是闲置状态(-1)。