Mesh减面算法详解
本篇文章所講述如何實現mesh減面工具。??
思想由作者創建。
目錄
1、Unity Mesh對象里的數據構成
2、智能減面詳解
Unity Mesh對象里的數據構成
? 這里主要介紹相關的數據,如下圖。
??? Triangles數組存儲的是所有三角形對應于vertices數組里的頂點,triangles從坐標0~n依次存儲了每個三角形三個頂點在vertices下的位置,uv也是跟vertices對應的,知道這些后我們就可以對mesh任意操作了。
智能減面詳解
減面前數據結構準備
??? 在減面之前首先要將每個頂點自己做管理,以便容易操作,下面是偽代碼,主要是因為這些數據對減面息息相關。
??? 首先要把mesh的頂點數據單獨輸出出來,每個頂點的存儲結構可以是這樣:
struct Triangle{Vertice [] vert;}struct Vertice{//自身頂點Vector3 vert;//與自身連接的三角形List<Triangle> nearbyTri;//與自身相連的點List<Vector3> nearbyVerts;//是否為邊頂點bool border;}1、找到連接自身的三角形
??? 將mesh里的頂點按照順序從0~n遍歷,比如第0個下標的頂點,在?? ??? Triangles中依次對每個三角形的索引進行查找,只要有一個三角形的索引是自己的下標那么他就是連接自身的三角形。
nearbyTri里三角形的順序是圍繞著該點旋轉為順序存儲,要確定,后面要用到。
??? 如圖,每個三角形都有一條邊與其他三角形共邊,如下找到1這個三角形,找到這個三角形與其他三角形共用的頂點除了中間的點外,那么會找到2這個三角形,那么2就是鄰居三角形,然后2再找其他的以此類推。竟然三角形能確定那與自身相連的點順序也是沒有問題的。存儲順序順時針,判斷順時針方法:三角形1黃邊叉乘藍邊結果為正,三角形2黃邊叉乘黑邊結果負,負在左邊,所以順時針就可計算。
2、是否為邊頂點
??? 每個三角形都有兩條邊與其他三角形共邊那么不是邊頂點。
???
只要有一個三角形只有一條邊與其他三角形共邊,那么這個頂點就是邊頂點。
減面算法
??? 本次算法通過減點實現減面,不加點或偏移點的計算。
??? 在上述步驟走完后這里進行減面,如果不想對邊操作上面也已經標記了邊,直接跳過就行。
??? 步驟:?
?????? 1、遍歷頂點,對頂點計算是否刪除
?????? 2、頂點刪除位置重建三角形
??? ??? 3、迭代遍歷
1、遍歷頂點,對頂點計算是否刪除
?? 遍歷每一個頂點,處理完一個頂點遍歷下一個頂點知道遍歷完一遍。
??? 遍歷找到第一個要處理的點如圖所示。
??? 減點需要兩個條件成立:
???
所有面交叉計算法線夾角角度是否小于設定值
?????? 計算出每個三角形切線方向也就是垂直該面的正向,比如1這個三角形,順時針任意找到天邊叉乘(如黃叉藍)得到一個向量。
??? 將得到的每個向量與其他向量點乘求出夾角,找到最大的夾角比如下圖這個(面是可以任意組合,比如2和5,這里假設找到1和2是最大夾角),假設本輪迭代所設置的減面角度小于這個30,那么這個點不能減,否則該條件成立。
每個三角形連接該定點兩條邊的差的長度是否小于設定值
?????? 假設兩條邊的插值在設定范圍內,那么條件成立。否則如下圖黃和藍兩條邊差值有0.5米,而設定是0.4,那么不成立。因為插值太大影響的范圍比較大,減面后出問題幾率大。
2、頂點刪除位置重建三角形
點被刪除后與這個點相連的其他點連接起來會有下圖兩種情況發生,我們通用將第二種情況處理成多個凸邊形處理。
順時和逆時針遍歷線段,只要發現如圖1紅色圈的這種凹拐點就記錄為連接點,兩邊都確定了一個點就將這兩個點連接分為兩個部分,一個部分是凸邊形,另一部分繼續處理,如圖2又找出了兩點又分出一個凸邊形,以此類推直到處理完畢。判斷凸凹用叉乘。
??? 凸邊形要構建諾干個三角形,如下圖中間的點被刪了,這時候要構造三角形,怎么構造最合適呢?
??????
? ? 那么我們就要遍歷所有組合的三角形,如下圖(1-2-6、2-9-8、3-10-6等)這些組合,計算每個三角形3條邊比值最小的那個,那它基本是最接近等邊三角形的。
?????? 這里找到2-9-8最像等邊三角形,那么就連接,對應將黑色邊上的點所對應的與自身頂點連接三角形添加到它們的隊列,2-9-8連接好后被分出了兩個地方需要連接,這個直接遞歸,然后規則跟上面一樣處理,直到處理完畢。
?????? 這個頂點弄完就到下一個點啦,就這樣遍歷直到點減到設定的值。
3、迭代遍歷
?? 當遍歷了一遍頂點還沒減到設定的值,那么就要就要不斷迭代,每次迭代上述兩種條件越加越大,直到點減到設定的值或者迭代次數結束。
參考文獻
總結
以上是生活随笔為你收集整理的Mesh减面算法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7利用docker 快速搭建
- 下一篇: 子平格局——戊癸化火格