2011-05-16 63 views
0

我有一個面向任何方向的多邊形,並且定位在三維空間的任何位置。我需要將多邊形轉換爲xy平面,以便我可以在2D中執行各種操作(尤其是在多邊形的邊界框上生成點網格),然後將其轉換回來。將3d多邊形旋轉到xy平面中,同時保持方向

問題出現在轉換後的多邊形的方向上。如果我只想旋轉到平面中,我可以取多邊形的法線與xy平面之間的角度,並圍繞與兩個方向正交的軸旋轉(叉積)。但是,我要求多邊形的邊界框的方向應使邊界框的底部(最低z值)邊與xy平面共面,無論是在變換之前還是之後。換句話說,邊界框平齊地平放在與地面平行的一側。轉換後,該邊緣將平行於x軸。這是爲了使我在表面上生成的點的網格始終有平行於地面的行,而不管多邊形的方向如何。

我的方法是執行兩次旋轉;首先圍繞z軸旋轉由多邊形平面與xy平面相交形成的線與x軸之間的角度。這確保邊界框的底部不會移出xy平面。然後,再次圍繞x軸旋轉多邊形(新)法線與xz平面之間的角度。以下是步驟:

  1. 找到多邊形平面的公式(來自法線)。
  2. 找到多邊形的平面和xy平面的交點。這是xy平面中的一條線。
  3. 找到這條線和x軸之間的角度。
  4. 繞z軸旋轉多邊形的角度。
  5. 確定新的正常。
  6. 找出新法線與xy平面之間的夾角。
  7. 圍繞x軸以此角度旋轉多邊形。
  8. 多邊形現在應該位於xz平面中;使用最大/最小x和y值生成邊界框,生成點網格等,然後將所有內容都轉換回開始位置。

我意識到應該合併兩個旋轉來減少矩陣乘法的次數,但這是一般算法。

我不是圖形專家;任何人都可以提供有關此技術的建議有沒有更好的辦法?我的方法聽起來是否正確?我正在使用Java進行開發,並正在使用Transform3D類來進行旋轉。

+0

我投票結束我的問題。這可能太過本地化,而且我的方法無論如何都或多或少是正確的。它會更適合圖形論壇。寫這個問題的行爲幫助我解決了這個問題。 – 2011-06-01 04:35:42

回答

1

要處理三維多邊形,通常只需忽略Z座標(將平面有效投影到XY平面內),然後稍後恢復Z座標。

只有當原始多邊形垂直於XY平面時,唯一不能正常工作的原因是由此產生的映射退化爲一條線。

+0

我看不出有什麼幫助。在投影上生成點網格與將其放置在實際多邊形上不同。 – 2011-05-16 21:04:26

+0

啊,是的,因爲如果你插入了一個新的XY點,你也必須計算新的Z座標。嗯... – Alnitak 2011-05-16 21:07:07

0

您需要以下矩陣將頂點座標從幀x0,y0,z0更改爲x1,y1,z1並最終進行翻譯以使原點重合。

 // F0 changes x0,y0,z0 to world X,Y,Z    
    F0[0, 0] = X0.X; 
    F0[0, 1] = X0.Y; 
    F0[0, 2] = X0.Z; 
    F0[1, 0] = Y0.X; 
    F0[1, 1] = Y0.Y; 
    F0[1, 2] = Y0.Z; 
    F0[2, 0] = Z0.X; 
    F0[2, 1] = Z0.Y; 
    F0[2, 2] = Z0.Z; 
    F0[3, 3] = 1.0; 

    // F1 changes world X,Y,Z to x1,y1,z1    
    F1[0, 0] = X1.X; 
    F1[0, 1] = Y1.X; 
    F1[0, 2] = Z1.X; 
    F1[1, 0] = X1.Y; 
    F1[1, 1] = Y1.Y; 
    F1[1, 2] = Z1.Y; 
    F1[2, 0] = X1.Z; 
    F1[2, 1] = Y1.Z; 
    F1[2, 2] = Z1.Z; 
    F1[3, 3] = 1.0; 

    matrix = F1*F0