2009-04-17 50 views
3

我有一個3D建模應用程序。現在我正在雙面繪製網格,但是我想在對象關閉時切換到單面。是封閉的多邊形網格翻轉?

如果多邊形網格是封閉的(沒有邊界邊界/完全週期性的),似乎我應該總是能夠確定對象當前是否翻轉並自動更正。

翻轉意味着我的法線指向對象而不是指向對象。被翻轉是由於我的繞線規則和當前的正面設置不匹配,但我直接從幾何圖形計算法線,所以查看法線是檢測它的簡單方法。

我在想的一件事就是拿起邊框,找到最高點,並查看它的正常點是否向上或向下 - 如果它是向下的,則對象被翻轉。

但似乎這種解決方案可能容易出現退化幾何或浮點錯誤的錯誤,因爲我只看到一個點。我想我可以得到所有6軸對齊的範圍,但這似乎是一個稍微好一點的kludge,而不是一個適當的解決方案。

有沒有一個強大的,簡單的方法來做到這一點?強大的硬也將工作.. :)

+0

我認爲你應該更好地解釋'翻轉'的含義,即翻轉x,y或z? – 2009-04-17 16:08:07

+1

我認爲他意味着如果法線向內指向(因爲它們應該指向外部)。 – 2009-04-17 16:14:59

回答

5

這是一個強大的,但緩慢的方式來獲得有:

採取邊框從心(強制抵消的一個角落裏的關閉之外來保證多邊形網格),然後創建一個線段到網格上任意三角形的中心點。

測量該線段與三角形法線之間的角度。

將該線段與網格的每個三角形面(包括用於生成線段的三角形)相交。

如果存在奇數個交點,則法線與線段之間的角度應爲< 180.如果有偶數,則應該大於180。

如果有偶數個交叉點,則數字應該顛倒。

這應該適用於非常複雜的表面,但它們必須關閉,否則它會打壞。

2

「我畫網格雙面」

爲什麼要那樣做?如果你使用的是OpenGL,那麼有更好的方法去拯救你所有的工作。使用:

​​

這樣,所有的多邊形都是雙面的。
你想使用單面照明的唯一原因是,如果你有一個開放的或部分倒置的網格,並且你想以某種方式通過讓它們未被照亮來指示屬於內部的部分。

一般來說,你所提出的問題是幾何處理中的一個未解決的問題,而AFAIK並沒有確定的一般方法,總是可以確定方向。正如你所建議的那樣,有幾乎總是有效的啓發式方法。
另一種方法讓人想起一個着名的多邊形點算法:在網格上選擇一個頂點,然後從法線方向射出一個射線。如果射線擊中偶數個面,則法線指向外部,如果它是奇數,則法線朝向內部。注意不要將起點視爲交點。這種方法只有在網格是封閉的流形時才起作用,並且如果光線正好在兩個多邊形之間傳遞,它可以達到一些邊緣情況,因此您可能需要多次執行該操作並進行前導投票。