网格半边结构(Half edge mesh)

网格半边结构(Half edge mesh)

1、网格的表示

在计算机图形学上,表达表面网格的数据结构有三种,分别是面列表( List of faces)、邻接矩阵(Adjacency matrix)、半边结构(Half-edge)。

面列表示例:
网格半边结构(Half edge mesh)_第1张图片

邻接矩阵示例:
网格半边结构(Half edge mesh)_第2张图片

半边结构示例:
网格半边结构(Half edge mesh)_第3张图片

网格半边结构(Half edge mesh)_第4张图片

2、网格分类

流形网格(manifold mesh)
非流形网格(non-manifold mesh)

如果网格的每个边最多被两个面片共用,那么这个网格就是流形网络,否则称为非流形网络。

非流形网络例子:
网格半边结构(Half edge mesh)_第5张图片

3、网格半边结构(Halfedge)

网格半边结构

半边数据结构&网格细分与简化

doubly connected edge list 或者叫 half-edge data structure。
最大特点是半边,每个边分为两个半边,每个半边都是一个有向边,方向相反。如果一个边被两个面片公用,则每个面片都能各自拥有一个半边。如果一个边仅被一个面片占用(边界边),则这个面片仅拥有该边的其中一个半边,另一个半边为闲置状态。每一条半边仅存储它的起点指针,半边数据结构仅支持流形网络。边沿逆时针方向朝向每个面。

网格半边结构(Half edge mesh)_第6张图片

4、网格半边结构实例

以一个正方形为例,这是在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


把顶点和面信息提取出来:
网格半边结构(Half edge mesh)_第7张图片

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个顶点和一个四变形组成。

顶点和边的关系

网格半边结构(Half edge mesh)_第8张图片

一共构建了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)。

你可能感兴趣的:(Threejs-Shader)