BSP分割演算法補充——關於分割一個三角形

來源:互聯網
上載者:User
 

BSP分割演算法補充——關於分割一個三角形 上篇文檔寫完後,做了一個比較複雜的情境,進行分割後發現原演算法的一些問題,在此做一個補充。根據此補充,原文檔將被刪掉重新修改完後再發,對各位讀者造成的不便,希望大家能夠見諒。在上篇文章裡談到的分割演算法裡有關被分割面的處理,採取的是直接將被分割面正負都放的策略。當時認為這隻會對AABB的計算產生影響,所以也就堂而皇之這麼寫上去了。這個演算法雖然簡單,但是在之後的Portal處理時會面臨很多困難,這一點也是我開始沒有考慮到的。在將情境變得複雜之後,這個問題就越發顯現出來:在有些葉子,將會僅包括若干被分割的共用三角形,且這些三角形根本無法構成封閉空間。然而,這些葉子卻被送入了Portal計算,最後出來的Portal非常詭異,甚至包括了在同一面上的若干個Portal。用更多的思路更改Portal演算法,倒不如從根本上將空間分割得更為合理,也就是採取標準的做法:將被分割三角形分割開,分割為多個三角形,分別放入相應空間。 其實這個演算法很簡單,一個三角形如果被一個平面分割,直觀上看,有且只有兩種情況:一種是在正負各產生一個三角形;另一個是在一側有一個三角形,另一側有兩個三角形。直觀上說,無論哪種情況,關鍵演算法流程都是:順序訪問原三角形的邊,設邊的第一個頂點是v0,第二個頂點是v1。如果這個邊的兩個頂點均在平面一側,則兩個頂點算入平面相應一側的新多邊形。如果有一個點在平面上,則這個點如果是這個邊的第一個頂點,應該在平面兩側的新多邊形中都要放。如果是第二個頂點,則需要判斷第一個頂點在平面的哪一側,並將之放入相應空間(只放一次)。可參考(左)來進行理解。如果這個邊被平面切割,則:首先算出來切割後的頂點vip,注意這裡需要根據頂點格式分割,法線、紋理座標均應分割。這時,同樣是判斷第一個頂點在平面哪一側,根據此,把v0、vip、v1按照相應順序組合,分別放到兩側的多邊形中(在這過程中,vip會兩側都放)。這個演算法有幾個需要注意的地方:首先,為了產生頂點順序與原三角形一致的三角形(即順時針三角形產生後仍是順時針,逆時針三角形產生後仍是逆時針),我們必須要按照相應的順序遍曆原三角形的邊:v0-v1、v1-v2、v2-v0,只有順序訪問原三角形的邊才能保證產生後的三角形的順序。如果一開始的順序就很詭異,那麼最後產生出來的三角形順序將很難保證,代碼也會很不直觀。第二,分割出來兩側的是多邊形而不是三角形,這需要分開判斷,如果多邊形的頂點數量是3,說明這一側產生的是一個三角形,那麼就好辦了,直接使用這個三角形即可。如果是4,說明是一個四邊形。如果設四邊形頂點順序是v0 v1 v2 v3那麼,組成這個四邊形的兩個三角形分別應該是v0-v1-v2和v0-v2-v3。具體的推導過程就不說了,如果覺得難於理解,可以參考下面的圖,就容易明白了。其中,OV是指原始三角形的三個頂點,V是分割後的這個四邊形的四個頂點,請注意順序。第三,注意法線的切分,如果兩個頂點的法線方向正好相反(當然,這是特殊情況),那麼最後產生的新頂點的法線會是0!在這種情況下,法線需要單獨作一下處理,我的處理是將整個面的法線賦給這個頂點,當然,您也可能有更好的方式。第四,在分割中會產生新的頂點和面,所以最後BSP的頂點數和面數經常會超過在模型未經處理資料裡的頂點數和面數。但現在由於沒有被兩個葉子共同共用的三角形了,所以,一個葉子中的三角形可以統一建一張IB,一次渲染了,速度當然會比使用共用面要快。 切分演算法並不是唯一的,正如BSP分割的方式也並不唯一一樣,關鍵還是選擇對自己最容易掌握,最有利的演算法。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.