2010-08-31 85 views
2

給定兩個正交的單位向量A和B以及兩個不同的正交單位向量C和D,我需要3×3方向餘弦矩陣或一個將旋轉A來對齊C的C的四元數,與D對齊。3D旋轉算法需要

這些向量都是3向量(x,y,z)。

我有一個蠻力算法,但我幾乎肯定有一個更簡單的解決方案。而我的網頁搜索還沒有透露。我使用C#,但如果你有東西在C,或FORTRAN,或基本(等),我可以將其轉換。或者,我可以使用數學上寫出的術語。

應用程序正在確定航天器所需的方位,以便與其剛性連接的光學設備將正確對齊以拍攝照片。 (必須獲得光學瞄準鏡的瞄準方向和光學裝置相對於瞄準瞄準鏡的適當旋轉,因此需要一次校準兩個矢量)。該計算可以用於由實時感測數據饋送的環路中,並且蠻力解決方案太慢了。

回答

3

我重讀了你的問題,下面的答案(而右)並沒有給你你想要的。此鏈接約爲constructing a 3x3 rotation matrix。因爲它們都是正交的單位向量,所以你只需要再添加一個來構造基礎(爲此使用交叉乘積)。所以現在你有兩個基礎{A,B,AxB}和{C,D,CxD}。將{A,B}移動到{C,D}的旋轉將重新表達a1A + a2B + a3(AXB)爲b1C + b2D + b3(CxD)。因爲它是線性的,你只需要知道它是如何表現的(這是唯一確定線性變換的)。因此,以{A,B,...}爲基礎,並且讓變換爲T,我們看到T(1,0,0)= C,T(0,1,0)= D和T(0, 0,1)= CxD。記住A =(1,0,0)等,但這個矩陣的列只是M =(C,D,CxD)

要使用這個矩陣,你必須在基礎上表達每個向量{A,B,CxD},然後再將它乘以M.您以相同的方式執行此操作。事實上,它是從你的正常基礎轉化爲{A,B,...}的矩陣,而上面的M將它翻譯爲{C,D ...},那麼MN(這裏的左乘法)將從你的基礎到{C,D,..}並提供你想要的旋轉。

所以,現在,所有的矢量的基礎{C,d,..} :(表示

的解決方案是又一變換矩陣。從該一個地圖{A,B,..}你的最終矩陣是(N^-1)MN,好消息是因爲N是正交的,所以你只需要它的轉置就可以了。

訣竅是選擇你的主要基礎,以便你處理的矩陣最漂亮。

+2

下面是測試溶液: 如果A和B將被旋轉到 d和E正交單位矢量其也是正交單位矢量 (注意在從原來的問題變量名的改變。) 然後計算交叉乘積:C = BXA和F = EXD 然後所需的旋轉矩陣爲:Dx * Ax + Ex * Bx + Fx * Cx,Dx * Ay + Ex * By + Fx * Cy,Dx * Az + Ex * Bz + Fx * Cz, Dy * Ax + Ey * Bx + Fy * Cx,Dy * Ay + Ey * By + Fy * Cy,Dy * Az + Ey * Bz + Fy * Cz, Dz * Ax + Ez * Bx + Fz * Cx,Dz * Ay + Ez * By + Fz * Cy,Dz * Az + Ez * Bz + Fz * Cz 非常簡單,計算速度快,沒​​有奇點。 – 2010-08-31 15:54:13

1

https://alleg.svn.sourceforge.net/svnroot/alleg/allegro_outdated/branches/allegro/src/math3d.c

3D圖形幾乎完全代碼....檢查出底部的功能開始..

get_align_matrix_f 

,並在這裏不用同爲quaterian ...

https://alleg.svn.sourceforge.net/svnroot/alleg/allegro_outdated/branches/allegro/src/quat.c

也在矩陣中,它可能不會給你從vactor A到C的最短(或直接)路徑,所以如果你正在製作視覺效果,那麼最好使用quats。

1

鑑於宇宙飛船需要花費數億美元,您可能希望找到能夠在睡夢中完成此類事情的人,並要求他們使用代碼生成防彈和優化的解決方案,而不是依賴此處的說明。 (除非這只是一個練習。)

另外,您選擇的解決方案應該非常重視飛船上可用的推進器;你希望輪換使用盡可能少的燃料,這將取決於它們對宇宙飛船本質上的作用。我假設你已經設置了這個問題,以便一個旋轉軸繞着Z軸旋轉;你是否可以圍繞x和y獨立旋轉,還是隻有另一個軸?有些旋轉比其他旋轉更昂貴(例如,由於沿某些軸的慣性矩不同)? (A x C),將A移動到C並旋轉所需的旋轉軸(請參閱維基百科,以便沿軸旋轉)。然後找出對B有什麼影響(通過將旋轉矩陣乘以B)並計算B和D之間的角度;最後,沿着(B×D)軸旋轉 - 在這一點上最好與C軸相同 - 來修正這個差異(給出另一個旋轉矩陣)。兩個矩陣相互交錯,瞧,你就完成了。

+0

你的想法是正確的,但是對這個問題的解讀太多了。這是對衛星系統的詳細模擬,具有硬件在環的潛力。所以我們沒有在硬件上花費過多的代價。而且,我們只在需要的方向感興趣(在本單元中),而不關心如何到達那裏。到達那裏確實是一個完全不同的問題,並且將由完全不同的一套軟件完成,除了您提到的問題之外,還必須執行諸如避免將任何敏感傳感器指向太陽的任務。 – 2010-08-31 15:23:03

0

稍後,我知道原來的帖子,但如果您也遇到列/行主要和左/右手混淆問題,如果您想將Mark T的精彩結果編碼爲WPF,您可以這樣做:

static public Matrix3D TwistToNewAxes(Vector3D A, Vector3D B, Vector3D D, Vector3D E) 
    { 
     Vector3D C = Vector3D.CrossProduct(B, A); 
     Vector3D F = Vector3D.CrossProduct(E, D); 

     Matrix3D result = Matrix3D.Identity; 

     result.M11 = D.X * A.X + E.X * B.X + F.X * C.X; 
     result.M21 = D.X * A.Y + E.X * B.Y + F.X * C.Y; 
     result.M31 = D.X * A.Z + E.X * B.Z + F.X * C.Z; 
     result.M12 = D.Y * A.X + E.Y * B.X + F.Y * C.X; 
     result.M22 = D.Y * A.Y + E.Y * B.Y + F.Y * C.Y; 
     result.M32 = D.Y * A.Z + E.Y * B.Z + F.Y * C.Z; 
     result.M13 = D.Z * A.X + E.Z * B.X + F.Z * C.X; 
     result.M23 = D.Z * A.Y + E.Z * B.Y + F.Z * C.Y; 
     result.M33 = D.Z * A.Z + E.Z * B.Z + F.Z * C.Z; 

     return result; 


    } 

非常感謝馬克!