Loop Subdivision與Modified Butterfly Subdivision
crease是什麼
當說一條邊是crease edge的時候,我們的意思其實是說這條邊是sharp edge.
為的是在Subdivision的時候能夠保留一些銳利的部分,例如
下圖中的色邊即為標記的sharp edge,標記出來的目的是為了在之後的Subdivision過程中還能保持銳利。
Loop Subdivision
參考:Piecewise Smooth Surface Reconstruction
Loop Subdivision包含3個階段:為每條邊計算一個新的頂點;更新原有舊頂點的位置;更新網格的拓補結構。
預處理
進行下面的操作之前,需要識別出每一個頂點的型別。
A smooth vertex is one where the number of incident sharp edges s is zero; a dart vertex has s = 1; a crease vertex has s = 2; and a corner vertex has s > 2. Crease vertices are further classified as regular and non-regular depending on the arrangement of smooth edges.An interior crease vertex is regular if it has valence 6 with exactly two smooth edges on each side of the crease; a boundary crease vertex is regular if it has valence 4. All other crease vertices, whether interior or boundary, are non-regular.
將每個點按照crease邊的入度s分別劃分為normal vertex(s=0)、dart vertex(s=1)、crease vertex(s=2)和corner vertex(s>=3),其中crease vertex根據邊的數量以及排列分為regular crease vertex和non-regular crease vertex.
regular crease vertex有兩種情況
(a)如果頂點不在邊界上(在mesh內部),要求頂點共與6條邊相連,且兩條crease一邊有2條smooth邊(即普通邊)。如下圖:
(b)如果頂點在邊界上,那麼只要周圍相連邊的數量為4即是regular
crease vertex中不是regular的就是non-regular
(1)為每條邊計算一個新的頂點
根據邊上兩個端點的型別,查表Table.1,得到的序號去上圖找對應的權重分配策略。
注意:只有crease邊才需要查表,普通邊直接按照下圖的smooth edge來計算,邊界邊兩個頂點權重1/2
(2)更新原有舊頂點的位置
根據頂點的型別來更新其位置。
(3)更新網格的拓補結構
Modified Butterfly Subdivision
可以參考 : https://www.cnblogs.com/yezhangxiang/archive/2011/04/10/2011284.html
一條邊的兩個頂點v1和v2,尋找v1和v2各自周圍點,根據其連線邊的數量不同,採取不同的權重分配策略(共四種)
(a)沒什麼好說的
(b)當v1和v2其中一個連線邊的數量為6,另一個不為6時。不為6的那個點稱為k-vertex(上圖中是v1),該點的權重為3/4,剩下1/4的權重按該點周圍點的數量分配給周圍點(v2也是v1的周圍點s0)。
注意特殊情況:如果處理的模型是非閉合的,即處理的模型有開口。那麼當尋找v1周圍的頂點並儲存時,應該注意儲存頂點的順序問題(k=4,>=5的情況)
當前處理的邊是(v1,v2),假設一向上找周圍頂點,找到邊(v1,3)遇到邊界邊停止,想要找剩下的頂點就需要從(v1,v2)向下尋找,找到點的順序是5,4.在最終儲存時需要將向下尋找時找到的點倒序存到123後面才能保證順序正確。
(c)分別對v1和v2各執行一次b,計算出的兩個新頂點取平均值
(d)處理邊界邊和crease邊
先說邊界邊的情況,下圖中紅色的為boundary edge,假設當前處理的邊為AB,那麼就需要找到AC和BD,頂點C和D的權重為-1/16,A和B的權重為9/16
如果處理的是crease邊,那麼左右兩邊的數量不一定為1,可能有多條
也可能一條也沒有。
如果一條也沒有,直接令這一側的頂點權重為1/2.如果有多條crease邊,則讓它們平分這-1/16的權重。
效果
相關文章
- butterfly簡單使用教程
- JavaScript與Event LoopJavaScriptOOP
- nginx expires if_modifiedNginx
- node基礎與event loopOOP
- node 基礎與 Event LoopOOP
- Node.js Event Loop與瀏覽器 Event Loop(事件環)Node.jsOOP瀏覽器事件
- 搭建部落格 (Hexo + github + butterfly主題)HexoGithub
- for loopOOP
- PG: Estimate last modified or read time of a tableAST
- Linux下Yum(Yellow dog Updater, Modified)Linux
- 微任務、巨集任務與Event-LoopOOP
- Event LoopOOP
- Expires, Last-Modified, Etag快取機制AST快取
- R.java was modified manually! Reverting to generated version!Java
- kettle modified javascript 步驟的一個例子JavaScript
- event loop整理OOP
- node event loopOOP
- javascript - event loopJavaScriptOOP
- JavaScript Event LoopJavaScriptOOP
- Ruby loop 方法OOP
- nested loop心得OOP
- Last-Modified Header in Asp.net Core MVCASTHeaderASP.NETMVC
- 淺析瀏覽器與nodejs中的event loop瀏覽器NodeJSOOP
- 瀏覽器的event loop和node的event loop瀏覽器OOP
- ora-01439:column to be modified must be empty to change datatype
- 瀏覽器event loop和node的event loop講解瀏覽器OOP
- 理解event loop(瀏覽器環境與nodejs環境)OOP瀏覽器NodeJS
- Js與Nodejs的event-loop的執行機制NodeJSOOP
- 淺談event loopOOP
- Performance Without the Event LoopORMOOP
- 月度文章——Event LoopOOP
- Event Loop個人理解OOP
- Javascript之Event LoopJavaScriptOOP
- Daniel Powter: Free LoopOOP
- oracle plsql儲存過程_while loop_end loop_exitOracleSQL儲存過程WhileOOP
- HTTP 200 OK和HTTP 304 Not modified的由來HTTP
- 面試經典:Event Loop面試OOP
- 細說event-loopOOP