2010-03-23 49 views
6

我想將我的多邊形沿矢量投影到三維空間中的平面。我最好使用一個單一的變換矩陣來做到這一點,但我不知道如何構建這種矩陣。如何在三維空間中投影平面上的多邊形

鑑於

  • 飛機的參數(由+ CZ + d AX +),
  • 世界座標我的多邊形。正如標題所述,我的多邊形的所有頂點都位於另一個平面上。
  • 沿着該突出我的多邊形(目前多邊形的平面的法線矢量)

目標 -a 4×4變換矩陣,其執行所需要的投影中,方向矢量

  • 關於如何自己構建一個的一些見解

UPDATE

謝謝你的回答,它按預期工作。

對於發現這種情況的人來說,要小心一個詞:如果投影法線的平面與投影矢量平行,分母D將變成(幾乎)0,所以爲了避免奇怪的事情發生,對於這種特殊情況是必要的。我通過檢查D < 1e-5解決了這個問題,如果是的話,只需將我的多邊形沿着擠出矢量平移。

回答

12

假設多邊形頂點中的一個是(x0, y0, z0),方向矢量是(dx,dy,dz)

投影線上的一點是:(x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)

你想找到與平面這條線的交叉點,所以它插入平面方程ax+by+cz+d = 0和解決T:

t = (-a*x0 - b*y0 - c*z0 - d)/(a*dx + b*dy + c*dz) 

然後你有你的目標頂點:x = x0+dx*t

由於這是一個仿射變換,它可以通過一個4x4矩陣來執行。您應該能夠通過將x,y,z的三個方程寫爲x0,y0,z0的函數並獲取係數來確定矩陣元素。

例如,對於X:

x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx)/D 
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D 

D = a*dx + b*dy + c*dz是分母從上方。 y和z的工作方式相似。

結果矩陣:

1-a*dx/D -b*dx/D -c*dx/D -d*dx/D 
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D 
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D 
    0   0   0   1 

(注:在Direct3D的這個矩陣應該換位,因爲它使用行向量而不是列向量)。

+0

感謝您提供完整的解決方案。我馬上試試 – sum1stolemyname 2010-03-23 15:50:17

+0

我已經實施了您的解決方案。然而,由於我的方向矢量是(1 | 0 | 0),並且飛機處於45°的角度,所以我遇到了麻煩:側視圖:'| ----> /'where |是多邊形和/是要投射的飛機。在這種情況下,a * dx/D = 1,其中第一列中的另外兩個entr爲0(dy = dzt = 0)。這導致整個coumn爲0,有效地縮放我的多邊形爲0.我的應用程序不喜歡那樣。你知道這個解決方法嗎? – sum1stolemyname 2010-03-24 08:25:50

+1

@ sum1:第一列爲零意味着原始頂點的x座標將被忽略。這是預期的,因爲您的投影方向與x軸平行。它不會將您的多邊形縮放到0. – interjay 2010-03-24 10:10:51

相關問題