1. 程式人生 > >視覺化學習:作業3(1)(marchingcubes演算法)

視覺化學習:作業3(1)(marchingcubes演算法)

  • 本文為我在KTH學習Visualization這門課的作業,涉及到的知識點我在這篇note3,note4有記錄。課程簡介連結在這兒
  • 由於本文是在國外發布的,在國內閱讀文章時可能會出現沒有圖片的現象,目前我還沒有找到好的解決辦法,好像CSDN就是這樣。所以解決辦法就是翻牆~

第一題

這個題目主要是對下面這幾個cubes應用marching cubes的演算法,劃分isosurface(等值面),並且寫出它屬於哪一類(cube的每一個角都有大於和小於isovalue這兩種可能,因此總共是2^8=256類,除去對稱和旋轉等相似性,一共是15種)。我在做題的時候查了很多資料,發現網上視覺化的資料實在不多,即便是講了marching cubes的演算法,也都沒有很好的解釋到底怎麼應用。

我們要做的是把這九個立方體按下面的類別歸類,然後畫isosurface和triangles。

下面給出我的答案:

對於ambiguity的處理上,我的解法是仿照2D的Marching squares的asymptotic decider的以下推倒:

把它推廣到3D,並且通過程式設計實現計算:

每個cube一共8個頂點,所以一共有2^8=256種情況,刨去旋轉,對稱等重複情況,一共還有15種,這其中有一部分存在ambiguity,其他沒有ambiguity(下圖圓圈中即為所有有ambiguity的情況)。

然而這樣做處理ambiguity是顯示完全錯誤的。因為整個推倒過程雖然沒錯,我們也能夠從上面的運算中得到三維的漸近線交點的f值β。問題是二維中,已知漸近線交點的值後如何畫等值線就是唯一可求的,而三維中不能做這樣的推廣--由漸近線交點值我們沒法畫出等值面

。三維情況要比二維複雜得多,我們沒有辦法隨意做推廣。

那麼marching cubes到底要怎麼做?以下兩點比較重要:

①把三維降到二維,從每個面看是否存在ambiguity(六個面),在有ambiguity的地方用二維的amsyptotic decider進行判斷,都做好後,連線在一起。

二維的判斷公式,漸近線中點值,為:

②確定surface後,畫三角形,並沒有limimtation,只要選擇最好畫的即可。

以下是更正後的答案,前兩個cubes不存在ambiguity,所以上面的答案沒錯,不再贅述: