半边数据结构&网格细分

半边数据结构&网格细分

参考博客:

https://blog.csdn.net/lafengxiaoyu/article/details/51524361

https://blog.csdn.net/outtt/article/details/78544053

http://www.cnblogs.com/shushen/p/5251070.html

对于表面网络来说,其重要的特点在于拓扑,也就是曲面是如何表达的,而不是其顶点的位置。拓扑的不同造就了不同的数据结构和标准,不同的拓扑,其进行网格查询和编辑的性能也不同。
计算机图形学上,通常说的流形是一种几何模型表面(但不是所有的),即二维流形,对应拓扑流形。如果网格的每个边最多被两个面片共用,那么这个网格就是流形网络,否则称为非流形网络。

半边数据结构:

最大特点是半边,每个边分为两个半边,每个半边都是一个有向边,方向相反。如果一个边被两个面片公用,则每个面片都能各自拥有一个半边。如果一个边仅被一个面片占用(边界边),则这个面片仅拥有该边的其中一个半边,另一个半边为闲置状态。每一条半边仅存储它的起点指针

halfedge.png

半边数据结构仅支持流形网络。

半边数据结构的三个重要的数据结构——顶点、半边、面片

  • 顶点(Vertex):包含出半边(OutgoingHalfedge)的指针或索引

在半边数据结构中的点储存着x,y,z的位置和以其为起始点的半边的指针。在任意给定的点上存在超过一条我们可以选择的半边,但是我们只需要选择其中一条并且是哪一条没关系,在下面的查询方法中我们会看到解释。

struct HE_vert  
    {  
  
        float x;  
        float y;  
        float z;  
  
        HE_edge* edge;  // one of the half-edges emantating from the vertex  
      
    }; 
  • 半边(HalfEdge):包含终点(StartVertex)、邻接面(AdjacentFace)、下一条半边(NextHalfedge)、相反边(opposite)的指针或索引
struct HE_edge  
   {  
  
       HE_vert* vert;   // vertex at the end of the half-edge  
       HE_edge* pair;   // oppositely oriented adjacent half-edge   
       HE_face* face;   // face the half-edge borders  
       HE_edge* next;   // next half-edge around the face  
     };
  • 面片(Face):包含一条起始边(FirstHalfedge)的指针或索引对于一个半边数据结构的简单形式,一个面仅仅需要储存一个围绕它的边的指针,在一些特定场合可能要求我们储存比如材质和法向一类的信息。和上面一样,虽然有很多边围绕着面,我们只需要储存其中一条,而无所谓是哪一条
struct HE_face  
    {  
  
        HE_edge* edge;  // one of the half-edges bordering the face  
  
    }; 

现在问题来了。顶点可能有两条或以上的出半边,而顶点的数据表达只有一条出半边,那这条出半边是哪一条?半边的下一条半边又是哪一条?面片的起始半边又是哪一条?通过某个网格的数据结构图(如图1)能看得出这些信息吗?

答:事实上,半边数据结构的网格的构建通常是通过面列表来创建的,也就是说,正常的构建半边数据结构网格是通过一个一个面片的添加来构建的。

所以面的添加顺序就决定了点边面结构的信息,添加面的方法通常是addFace(a,b,c,…),a,b,c…参数是该面片按其某条环路顺序排列的顶点的指针或索引。注意,环路可以是顺时针或者逆时针,决定了该面片的方向(法向量的方向)。

三维网格细分算法:

Catmull-Clark subdivision

Catmull-Clark细分是一种四边形网格的细分法则,每个面计算生成一个新的顶点,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。

778572-20160307165055554-2123276712.jpg

1.网格内部F-顶点位置:

设四边形的四个顶点为v0、v1、v2、v3,则新增加的顶点位置为v = \frac{1}{4} ×(v0 + v1 + v2 + v3)。

2.网格内部V-顶点位置:

设内部顶点v0的相邻点为v1、v2,…,v2n,则该顶点更新后位置为
778572-20160307165322772-1642245811.jpg

,其中α、β、γ分别为α = 1 - β - γ。

3.网格边界V-顶点位置:

设边界顶点v0的两个相邻点为v1、v2,则该顶点更新后位置为v = \frac{3}{4}$$ ×v0 + $$\frac{1}{8}×(v1 + v2)。

4.网格内部E-顶点位置:

设内部边的两个端点为v0、v1,与该边相邻的两个四边形顶点分别为v0、v1、v2、v3和v0、v1、v4、v5,则新增加的顶点位置为v = \frac{1}{4} (v0 + v1 + vf1 + vf2) = \frac{3}{8} (v0 + v1) + \frac{1}{16} (v2 + v3 + v4 + v5)。

5.网格边界E-顶点位置:

设边界边的两个端点为v0、v1,则新增加的顶点位置为v = \frac{1}{2} (v0 + v1)。

Loop subdivision

Loop细分是一种三角形网格的细分法则,它按照1-4三角形分裂,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。下图为Loop细分格式的细分掩膜,对于新增加的顶点位置以及原始顶点位置更新规则如下:

778572-20160307165148085-190617796.jpg

1.网格内部V-顶点位置:

设内部顶点v0的相邻点为v1、v2,…,vn,则该顶点更新后位置为[图片上传失败...(image-267433-1547822243486)],其中


778572-20160307165237241-1432841958.jpg
SouthEast2 - 副本.png

2.网格边界V-顶点位置:

设边界顶点v0的两个相邻点为v1、v2,则该顶点更新后位置为 v = \frac{3}{4} ×v0 + \frac{1}{8} ×(v1 + v2)。。

SouthEast - 副本.png

3.网格内部E-顶点位置(新增点):

设内部边的两个端点为v0、v1,相对的两个顶点为v2、v3,则新增加的顶点位置为v = \frac{3}{8} (v0 + v1) + \frac{1}{8}(v2 + v3)。

SouthEast3 - 副本.png

网格内部某条边的两个端点为v0、v1,共享这条边的两个三角形的面是(v0,v1,v2)和(v0,v1,v3)

4.网格边界E-顶点位置(新增点):

设边界边的两个端点为v0、v1,则新增加的顶点位置为v = \frac{1}{2}×(v0 + v1)。

SouthEast4 - 副本.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容