是否有一個好的魯棒算法來計算凸多邊形的法向量(當然是3D)?對於三角形,很容易:一個需要兩個三角形的邊緣,並計算叉積:健壯的多邊形正常計算
vec3 u = point[0] - point[1], v = point[0] - point[2];
vec3 n = normalize(cross(u, v));
但這種方法並沒有真正延伸至多邊形非常好。多邊形的某些邊可以近似或「精確」共線(這通常發生在發生T形結消除的網格中),因此有必要選擇一對邊,從而給出「強」法線(兩邊都是「足夠長」並且它們保持「幾乎垂直」的角度)。
雖然這種方法仍然不適用於所有多邊形。想象一下光盤形狀的多邊形。如果它被細分得很細,所有的邊緣都會很短,所有的連續邊緣幾乎是共線的,無論光盤的半徑如何。同時,正常情況非常明確。
一個解決方案可能是找到最大的內切三角形並計算其正常值。但是,找到它會有O(n^2)
的複雜性,這看起來很難。
一個更好的解決方案可以是使用SVD或特徵值分解來計算法線,給定所有多邊形點,而不僅僅是三個或四個。
這是否有一個標準算法?任何人都有這樣做的好方法?
你有沒有考慮光盤的例子?我不認爲它非常強大,因爲連續邊的交叉積在那裏相當小。但是,否則,謝謝,我想這大多數時候會更好。 –
穩健性來自總和。 –
此外,使用epsilon保證該方法不具有數值穩健性。考慮有一個網格,其中有狹窄的多邊形。如果閾值很高,那些多邊形將不會有正常。如果它太低,算法可能會接受稍微不平坦的邊緣或其他次優邊緣對,即使在具有正常定義好的多邊形的情況下也會產生不精確的法線。 –