2013-01-16 19 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

谢谢,马库斯,该代码完美地工作。在我旋转手机时,图层看起来在所有轴上保持静止。 虽然,结果引入了另一个问题。我希望通过使用矩阵数学,我会避免在轴上的任何奇怪行为,但是会发生一些奇怪的事情。当我拨动我的手机,穿过图层的“顶部边缘”时,图层不会继续平稳地旋转。相反,当我接近轴线时,图层偏离轴线,所以我无法直接穿过它的边缘。这是我正在做的旋转类型的标准特征吗? –