你都需要下面的轉換矩陣:
[ x0_x y0_x z0_x o_x ]
M = [ x0_y y0_y z0_y o_y ]
[ x0_z y0_z z0_z o_z ]
[ 0 0 0 1 ]
這裏,Z0是正常的平面,o是你的飛機的起源,以及x0和y0是你的平面垂直於內兩個向量z0定義投影的旋轉和傾斜。
然後在您的XY平面上任意點(x,y)的可以投影到一個點(p_x,p_y,p_z)具有以下新的飛機:
(p_x, p_y, p_z, w) = M * (x, y, 0, 1)
現在,Z0在變換矩陣很容易,這是你的飛機的正常狀態,那簡直就是n = normalize(a,b,c)
。
在選擇休息時,你有明顯更多的自由。對於原點,您可以將平面與Z軸相交,除非平面平行於Z軸,在這種情況下,您需要其他東西。
因此,例如,
if (c != 0) { //plane intersects Z axis
o_x = 0;
o_y = 0;
o_z = -d/c;
}
else if (b != 0) { // plane intersects Y axis
o_x = 0;
o_y = -d/b;
o_z = 0;
}
else { // plane must intersect the X axis
o_x = -d/a;
o_y = 0;
o_z = 0;
}
在實踐中,你可能要更喜歡不同的測試比(c != 0)
,因爲與測試甚至會成功是C是非常非常小的,但是從零隻是不同的,導致你的起源是在說,x=0, y=0, z=10e100
這可能不會令人滿意。所以像(abs(c) > threshold)
這樣的測試可能更可取。然而,你當然可以採取一種完全不同的點在平面放的起源,或許最接近原始的座標系的原點的點,這將是:
o = n * (d/sqrt(a^2 + b^2 + c^2))
然後最後我們需要弄清楚的x0和y0。這可能是任何兩個與z0正交的線性獨立向量。
因此,首先,我們選擇在XY平面上的向量我們X0向量:
x0 = normalize(z0_y, -z0_x, 0)
現在,這個失敗,如果你的Z0恰好是形式(0,0,z0_z)的,所以我們需要對於一個特殊情況:
if (z0_x == 0 && z0_y == 0) {
x0 = (1, 0, 0)
}
else {
x0 = normalize(z0_y, -z0_x, 0)
}
最後讓我們說,我們不希望歪斜和選擇Y0爲垂直於兩X0,Y0和,然後,使用雙重交叉
y0 = normalize(x0_y*y0_z-x0_z*y0_y, x0_z*y0_x-x0_z*y0_z, x0_x*y0_y-x0_y*y0_x)
現在您已經全部填充您的轉換矩陣。
免責聲明:在使用浮點數表示您的數字時應該小心,在這些情況下,簡單(foo == 0)測試是不夠的。在開始實施東西之前,先閱讀浮點數學。
編輯︰重命名一些變量的清晰度
它是什麼你想要的是什麼?你想要飛機上的一個點和正常嗎?你想在飛機上有三個點嗎?你想要關於Z = 0飛機的飛機角度嗎? – wich 2011-01-25 14:33:23
嗨, 感謝您的快速響應。 我想能夠繪製飛機。 因爲我需要4點在飛機上,但是這個任務是更難的,然後做出更早的建議。 我想要的是YX平面到我的平面(Ax + By + Cz + D = 0)之間的仿射變換。經過這個轉變後,我可以用她來繪製我的飛機,將飛機的倒置變形應用到飛機上,我將在YX飛機上滑翔。 – talel 2011-01-25 14:47:16
那麼,a,b,c,d並沒有給你足夠的信息來獲得固定的仿射變換。投影仍然可以在平面內的任何原點以及原始XY平面的X和Y矢量到新平面的任何映射中,即任何旋轉或偏斜。 – wich 2011-01-25 14:55:18