2013-01-16 47 views
3

的請多多包涵一個單一軸的旋轉,我在矩陣數學是非常糟糕的。我有一層,我希望在參考環境中保持「靜止」,而手機旋轉到其他姿態。我有一個很好的MotionManager中工作,現在用在目前的態度multiplyByInverseOfAttitude,並應用所產生的增量爲旋轉使用CMRotationMatrix我的層(做獨立CATransform3DRotates的俯仰,滾轉和偏航引起的軸附近相當的古怪)。它的基本靈感來自代碼like this example反向CMRotationMatrix

我Concat的這另一個變換之前,我應用旋轉到我的層應用M34角度把戲。

[attitude multiplyByInverseOfAttitude:referenceAttitude]; 

CATransform3D t = CATransform3DIdentity; 
CMRotationMatrix r = attitude.rotationMatrix; 
t.m11=r.m11; t.m12=r.m12; t.m13=r.m13; t.m14=0; 
t.m21=r.m21; t.m22=r.m22; t.m23=r.m23; t.m24=0; 
t.m31=r.m31; t.m32=r.m32; t.m33=r.m33; t.m34=0; 
t.m41=0;  t.m42=0;  t.m43=0;  t.m44=1; 

CATransform3D perspectiveTransform = CATransform3DIdentity; 
perspectiveTransform.m34 = 1.0/-650; 
t = CATransform3DConcat(t, perspectiveTransform); 

myUIImageView.layer.transform = t; 

結果是漂亮,就像你所期望的,該層保持靜止的重力爲我四處移動我的手機,除了單個軸,y軸;手機保持平放並滾動,圖層按照手機的方向雙倍滾動,而不是保持靜止。

我不知道爲什麼這樣一個軸移動,而其他移動應用multiplyByInverseOfAttitude之後正確錯誤。當使用單獨的CATransform3DRotates進行俯仰,偏航,滾動時,我可以通過將滾動矢量乘以-1來輕鬆地解決問題,但我不知道如何將其應用於旋轉矩陣。這個問題顯然只有在你將觀點引入方程後纔可見,所以也許我做錯了。反轉我的m34值可以修正搖擺,但會在球場上產生同樣的問題。我需要弄清楚爲什麼這個軸上的旋轉是向後的,通過矩陣反轉該軸上的旋轉,或者以某種方式修正透視。

回答

2

你必須要考慮到以下幾點:

  1. 在你的情況,CMRotationMatrix需要調換(http://en.wikipedia.org/wiki/Transpose),這意味着交換列和行。
  2. 你並不需要設置轉化爲CATransform3DIdentity,因爲你覆蓋每一個值,這樣你就可以用空的矩陣開始。如果你想使用CATransform3DIdentity,你可以省略設置0和1,因爲它們已經被定義。 (CATransform3DIdentity是單位矩陣,參見http://en.wikipedia.org/wiki/Identity_matrix
  3. 要糾正也繞Y軸的旋轉,則需要使用[1 0 0 0乘以你的載體; 0 -1 0 0; 0 0 1 0; 0 0 0 1]。

令代碼以下更改:

CMRotationMatrix r = attitude.rotationMatrix; 
CATransform3D t; 
t.m11=r.m11; t.m12=r.m21; t.m13=r.m31; t.m14=0; 
t.m21=r.m12; t.m22=r.m22; t.m23=r.m32; t.m24=0; 
t.m31=r.m13; t.m32=r.m23; t.m33=r.m33; t.m34=0; 
t.m41=0;  t.m42=0;  t.m43=0;  t.m44=1; 

CATransform3D perspectiveTransform = CATransform3DIdentity; 
perspectiveTransform.m34 = 1.0/-650; 
t = CATransform3DConcat(t, perspectiveTransform); 
t = CATransform3DConcat(t, CATransform3DMakeScale(1.0, -1.0, 1.0)); 

或者與牛逼設置爲CATransform3DIdentity剛剛離開的0和1出:

... 
CATransform3D t = CATransform3DIdentity; 
t.m11=r.m11; t.m12=r.m21; t.m13=r.m31; 
t.m21=r.m12; t.m22=r.m22; t.m23=r.m32; 
t.m31=r.m13; t.m32=r.m23; t.m33=r.m33; 
.... 
+0

謝謝,馬庫斯,該代碼完美地工作。在我旋轉手機時,圖層看起來在所有軸上保持靜止。 雖然,結果引入了另一個問題。我希望通過使用矩陣數學,我會避免在軸上的任何奇怪行爲,但是會發生一些奇怪的事情。當我撥動我的手機,穿過圖層的「頂部邊緣」時,圖層不會繼續平穩地旋轉。相反,當我接近軸線時,圖層偏離軸線,所以我無法直接穿過它的邊緣。這是我正在做的旋轉類型的標準特徵嗎? –