我正在做一些事情,我在座標系sys A中有一個座標點,並且已經有一組座標點。我在空間N中也有一個法向矢量。我怎樣才能旋轉座標系sys A上的點,使底層平面與N有相同的法向?飛機的3D旋轉
想知道如果任何人有一個好主意如何做到這一點。謝謝
我正在做一些事情,我在座標系sys A中有一個座標點,並且已經有一組座標點。我在空間N中也有一個法向矢量。我怎樣才能旋轉座標系sys A上的點,使底層平面與N有相同的法向?飛機的3D旋轉
想知道如果任何人有一個好主意如何做到這一點。謝謝
如果你有,或者可以很容易地計算出你的點當前所在的平面的法線向量,我認爲最簡單的方法是圍繞兩個平面共同的軸旋轉。這是我怎麼會去一下吧:
M
正常您當前平面向量,N
正常到要旋轉到平面向量。如果M == N
您現在可以停止並保持原始點不變。計算旋轉角度
costheta = dot(M,N)/(norm(M)*norm(N))
計算旋轉軸爲
axis = unitcross(M, N)
其中unitcross
是執行交叉乘積,並將其標準化爲單位矢量,即unitcross(a, b) = cross(a, b)/norm(cross(a, b))
的功能。由於user1318499在評論中指出,如果M == N
,此步驟可能會導致錯誤,除非您執行unitcross
返回(0,0,0)
時a == b
。
計算從軸和角度的旋轉矩陣作爲
c = costheta
s = sqrt(1-c*c)
C = 1-c
rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ],
[ y*x*C+z*s y*y*C+c y*z*C-x*s ]
[ z*x*C-y*s z*y*C+x*s z*z*C+c ])
其中x
,y
,和z
是axis
的組件。這個公式被描述爲on Wikipedia。
對於每個點,計算它的相應的點上的新的平面
newpoint = dot(rmat, point)
其中函數dot
執行矩陣乘法。
這當然不是唯一的;正如peterk的回答中所提到的那樣,您可以進行無數次可能的旋轉,這將使平面正常變換爲M
,正常的平面爲N
。這與以下事實相對應:在完成上述步驟之後,您可以圍繞N
旋轉飛機,並且您的積分將處於不同位置,同時停留在同一平面上。 (換句話說,你可以做出的每個旋轉都符合你的條件,對應於上面描述的步驟,然後再圍繞N
旋轉。)但是,如果你不在乎飛機在哪裏,你的點會收起來,我想這種旋轉公共軸是剛剛獲得積分成你想要他們在飛機上最簡單的方式。
如果沒有M
做,但你有座標點在你開始平面相對到該平面的起點,可以計算從兩個點的位置x1
和x2
開始的法向量作爲
M = cross(x1, x2)
(您也可以在這裏使用unitcross
但它沒有任何區別)。如果你有個相對於原點不是在平面座標,你仍然可以做到這一點,但你需要三個點的位置:
M = cross(x3-x1, x3-x2)
我正在考慮做一個單位矢量[0,0,1]並沿着兩個平面使用點積來找出差異的角度,並將這些角度移動所有點。這是假設你想讓z軸與法線向量對齊,否則分別對x和y使用[1,0,0]或[0,1,0]。
這是不是隻對準z軸?在x或y中會有更多的Dof's – bendervader 2012-02-24 00:41:18
單個矢量(你的normal - N)將不夠用。另外兩個維度需要另外兩個向量。 (想象一下,你的三維空間仍然可以圍繞法線向量旋轉/旋轉,而你需要另外兩個向量來釘住它)。一旦你有了正常的飛機,另外一架在飛機上,第三架應該很容易找到(左手或右手取決於你的系統)。
確保所有三個都被歸一化(長度爲1)並將它們放在矩陣中;使用該矩陣轉換3D空間中的任意點(使用矩陣乘法)。這應該給你新的座標。
有道理!我需要找出一種方法來獲得其他載體:S謝謝! – bendervader 2012-02-24 00:53:57
-1:這個答案含糊不清。 – andand 2012-02-24 03:29:43
+1好答案。唯一的抱怨(在一定程度上上升到一個抱怨的水平,這是值得懷疑的)我已經是你沒有提及四元數旋轉作爲步驟4和5的可能替代。它們更有效率。 – andand 2012-02-24 03:26:58
@andand:通常我會以分析的方式處理這類事情,所以我對四元數不完全熟悉。但是,如果我有時間,我會編輯它。 – 2012-02-24 06:22:44
一個很好的總結在http://en.wikipedia.org/wiki/Quaternion_rotation – andand 2012-02-24 13:34:55