2010-11-23 30 views
2

我試圖創建由任意曲面相交定義的單元格的交互式3D表示。我很難弄清楚如何從中創建網格(或者是否有比我應該用於表示3D卷的網格更好的東西?)。每個表面s被用於平面,球體,圓柱體,圓錐體等的解析表達式爲:S = F(X,Y,Z)= 0,給出如這裏:建模通過曲面交點定義的3d單元格

enter image description here

對於每個單元格都有一個表面列表和每個表面的+/-感應。通過這個,很容易確定x,y,z點是否位於單元格內部,方法是將該點插入每個邊界曲面的公式中,並且如果結果對所有+曲面都爲+,對於所有曲面,則對於所有曲面,點在裏面。顯然,如果任何曲面的結果爲零,那麼該點就位於曲面上。

我可以測試成千上萬的網格點,爲每個單元格記錄那些位於該單元格內的點,然後使用這些點的最外層來爲該單元格創建網格。但是,我擁有數千個單元,而且這個速度不夠快。許多細胞與其他細胞相比很小或很小,所以如果我這樣做的話,我需要一個非常好的網格點。

任何人都可以提出一個有效的方法把細胞定義成這種方式成一個靜態的3d模型?是否有任何類型的庫與這種可以爲我構建三維網格的幾何規範一起工作?我錯過了明顯的東西嗎?

感謝, 尼克

回答

1

作爲一個普遍的問題,這是很困難的:我認爲這基本上是一個一般的非線性規劃問題。如果你的邊界是由任意函數生成的,那麼即使有一個這樣的函數也可能有任意數量的單元格;沒有關於功能的更多信息,我認爲你不可能比檢查網格點更好。

如果您對功能有所瞭解(例如,平面,球體,圓柱體和圓錐體都是圓錐體),您可能會做得更好。無論如何,你可能想從一個組合方法開始;說,給定任何3個邊界,確定是否有任何三個點相交的點。在任何情況下,一旦確定了單元格的角點和邊緣,就可以使用基於網格的方法來構建顯示網格 - 例如,用軸對齊的平面切片您的曲面,以確定頂點和三角形發送到您選擇的3D圖形庫。


另一個想法:既然你被f(x,y,z)=0定義你的面,就可以與一羣點開始,數字他們用牛頓的方法步驟或東西遷移到附近的表面:

point p = (x,y,z) 
scalar value = f(p) 
while abs(value) > epsilon: 
    vector gradient = gradient_of_f(p) 
    p -= gradient * (value/dot(gradient,gradient)) 
    value = f(p) 

類似的東西應該允許您近似邊緣和角點。可能很難弄清楚如何將這些類型的點連接成網格,但...

相關問題