簡體   English   中英

沿逆時針方向排序3D多邊形頂點

[英]Sorting 3D polygon vertices in anticlockwise direction

我必須找到多邊形的法線,但是要做到這一點,我首先必須沿逆時針方向對頂點(x,y,z)進行排序。 可以說,我給了用戶輸入的n個頂點,我如何在逆時針方向上將頂點變成多邊形?

您不能在不知道法線的情況下訂購積分,反之亦然。 如果您說“從正面逆時針方向”,那么您需要知道正面在哪一邊,因此您需要知道法線。 因此,您的問題目前沒有答案,因為它有點循環:您沒有足夠的信息來確定要尋找的內容。

您需要更多信息。 例如,如果此多邊形是凸曲面的一部分,則可以計算曲面的幾何中心。 然后在多邊形上選取任意3個非共線點a,b,c ,計算法線( norm((a-b)cross(c-b)) ),計算從質心到您的一個點的向量(例如b-質心 ),然后檢查法線是否與該矢量( 法線點(b-質心)的符號)方向相同(或相反)。如果方向錯誤,則將其翻轉。 本質上,您只是計算一個垂直單位矢量(記住兩個),然后確保它指向對象的內部/外部。

如果您的臉是凹面的一部分,則可以通過獲取法線與相鄰臉部法線的點積並將其翻轉為負值來使所有法線指向相同的大致方向。 您仍然需要確定一種方法來確定面部的哪一側在表面的內部與外部,但是至少所有法線都指向一個或另一個。

如果您沒有有關法線應該面對的大致方向的信息,則必須從其他地方獲取逆時針信息。 您可以對多邊形中心周圍的點進行排序,以使它們按順序排列,但是要確定該順序是順時針還是逆時針,則需要其他信息(例如,詢問用戶等)。

請注意,基於atan的2D解決方案隱式依賴於一些額外的信息:依賴於這樣的事實,即法線朝向屏幕外/紙張外並朝向您,觀察者,因此您可以圍繞該方向進行分類正常。 該假設通常是在沒有人真正談論過的情況下做出的。 但是,實際上,您需要確定正面和背面是哪一側-3D並不總是那么容易(如果要渲染到屏幕上並且設置了視點,則可以將其用作附加信息-例如法線朝向相機,然后圍繞該法線排序)。


通常,我們有3個未知數:

  1. 從“正面”看時的纏繞順序是什么?
  2. 我們選擇在平面的兩個垂直單位向量中的哪一個位於“前” “哪一側是前”?
  3. 給定點對應於纏繞順序的排序順序是什么?

我們需要其中兩個來確定第三個。

針對以下Andon的評論:對於光柵化器,它定義了#1本身(或從配置中獲取),並且API要求假定了#3,因此可以推斷出#2。

在您經常看到的2D情況下(我在上面提到),將#1指定為要求,假定#2為“面對觀察者的一側為前方”,因此可以使用atan來確定#3並按升序/降序排序。

在您最初的問題中,您知道#1(已經定義了它),但是您不知道#2(哪一側是正面?),因此無法確定#3。 您需要某種方法來確定#2(例如,遠離質心,面向觀察者等)。

阿坦

要找到一個點的角度(X,Y),您只需要執行atan(Y/X) 以下是一些警告:

http://upload.wikimedia.org/math/5/7/1/571efb70f630041f9e2b00019025171e.png Atan網域

最后,從最低到最高對結果進行排序(將360加到負數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM