2012-11-17 71 views
1

我目前正在使用增强现实,为此我想使用陀螺仪和Core Motion。我研究了Apple pARk示例代码,我了解了大部分我花时间阅读文档的数学,因为乍一看还不清楚!一切都很好,直到我试图使它在横向模式下工作。在横向模式下使用Core Motion

我不会在这里解释所有的理论,它会太长。但对于那些经历过它的人来说,我的问题是,我们采用态度的旋转矩阵来将这个旋转应用到我们的坐标上。好吧,直到这里才算正常,但Core Motion似乎并不适应风景模式。我在这个问题上看到了类似的问题,但看起来没有人有解决方案。

于是,我就做我自己,这里就是我的想法:

每次我们旋转装置景观,+ -90°旋转时(取决于景观左或右)。我决定创建一个4X4旋转矩阵来应用这个旋转。然后乘到cameraTransform矩阵(态度的3X3 CMRotationMatrix以4X4的自适应),然后我们获得矩阵cameraTransformRotated:

- (void)createMatLandscape{ 
switch(cameraOrientation){ 
    case UIDeviceOrientationLandscapeLeft: 
     landscapeRightTransform[0] = cos(degreesToRadians(90)); 
     landscapeRightTransform[1] = -sin(degreesToRadians(90)); 
     landscapeRightTransform[2] = 0; 
     landscapeRightTransform[3] = 0; 

     landscapeRightTransform[4] = sin(degreesToRadians(90)); 
     landscapeRightTransform[5] = cos(degreesToRadians(90)); 
     landscapeRightTransform[6] = 0; 
     landscapeRightTransform[7] = 0; 

     landscapeRightTransform[8] = 0; 
     landscapeRightTransform[9] = 0; 
     landscapeRightTransform[10] = 1; 
     landscapeRightTransform[11] = 0; 

     landscapeRightTransform[12] = 0; 
     landscapeRightTransform[13] = 0; 
     landscapeRightTransform[14] = 0; 
     landscapeRightTransform[15] = 1; 

     multiplyMatrixAndMatrix(cameraTransformRotated, cameraTransform, landscapeRightTransform); 
     break; 
    case UIDeviceOrientationLandscapeRight: 
     landscapeLeftTransform[0] = cos(degreesToRadians(-90)); 
     landscapeLeftTransform[1] = -sin(degreesToRadians(-90)); 
     landscapeLeftTransform[2] = 0; 
     landscapeLeftTransform[3] = 0; 

     landscapeLeftTransform[4] = sin(degreesToRadians(-90)); 
     landscapeLeftTransform[5] = cos(degreesToRadians(-90)); 
     landscapeLeftTransform[6] = 0; 
     landscapeLeftTransform[7] = 0; 

     landscapeLeftTransform[8] = 0; 
     landscapeLeftTransform[9] = 0; 
     landscapeLeftTransform[10] = 1; 
     landscapeLeftTransform[11] = 0; 

     landscapeLeftTransform[12] = 0; 
     landscapeLeftTransform[13] = 0; 
     landscapeLeftTransform[14] = 0; 
     landscapeLeftTransform[15] = 1; 

     multiplyMatrixAndMatrix(cameraTransformRotated, cameraTransform, landscapeLeftTransform); 
     break; 
    default: 
     cameraTransformRotated[0] = cameraTransform[0]; 
     cameraTransformRotated[1] = cameraTransform[1]; 
     cameraTransformRotated[2] = cameraTransform[2]; 
     cameraTransformRotated[3] = cameraTransform[3]; 

     cameraTransformRotated[4] = cameraTransform[4]; 
     cameraTransformRotated[5] = cameraTransform[5]; 
     cameraTransformRotated[6] = cameraTransform[6]; 
     cameraTransformRotated[7] = cameraTransform[7]; 

     cameraTransformRotated[8] = cameraTransform[8]; 
     cameraTransformRotated[9] = cameraTransform[9]; 
     cameraTransformRotated[10] = cameraTransform[10]; 
     cameraTransformRotated[11] = cameraTransform[11]; 

     cameraTransformRotated[12] = cameraTransform[12]; 
     cameraTransformRotated[13] = cameraTransform[13]; 
     cameraTransformRotated[14] = cameraTransform[14]; 
     cameraTransformRotated[15] = cameraTransform[15]; 

     break; 
} 
} 

然后就在我们更新所有我做的这点:

multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, cameraTransformRotated); 

之后,其余的代码保持不变,我只是希望注解以横向方向正确显示。现在,这是我唯一的想法,横向渲染效果不好,我将设备移动到右侧或左侧,注释向下或向上移动(就像当我没有添加此代码时)。

有没有人想出一个解决方案?我会继续寻找,特别是在CMRotationMatrix上,它似乎不是一个典型的旋转矩阵,我找不到任何文档明确说明这个矩阵的不同元素。

+0

我po在这里提出了一个类似的问题:http://stackoverflow.com/questions/11906611/augmented-reality-app-in-landscape-mode –

+0

运行这个计算出来吗?这太痛苦了! –

回答

2

我刚刚设法适应了这个(苹果的pARk示例)到风景(右)昨天,并希望分享所做的更改。它看起来工作正常,但请发出任何错误。这只支持风景,但可能很容易适应左侧。

在ARView.m,

在 - (无效)初始化,切换边界高度和宽度

createProjectionMatrix(projectionTransform, 60.0f*DEGREES_TO_RADIANS, self.bounds.size.height*1.0f/self.bounds.size.width, 0.25f, 1000.0f); 

在 - (无效)startCameraPreview

[captureLayer setOrientation:AVCaptureVideoOrientationLandscapeRight]; 

在 - (空)drawRect:

//switch x and y 
float y = (v[0]/v[3] + 1.0f) * 0.5f; 
float x = (v[1]/v[3] + 1.0f) * 0.5f; 

poi.view.center = CGPointMake(self.bounds.size.width-x*self.bounds.size.width, self.bounds.size.height-y*self.bounds.size.height); //invert x 
+0

哇谢谢你的分享!我会试一试,让你知道;) –

+0

对不起,我最近很忙:)是它支持风景很好,谢谢你的努力,但我恐怕在数学上它是错的,我的第一个解决方案是错误的太。我们刚刚切换变量。一个好的解决方案是重新映射设备坐标系,它可以在Android上运行,并且运行良好。为什么iOS会不提供这些? 无论如何感谢您的努力:) –

+0

我也试过这个以及它不起作用。由于它被偷偷操纵,适当的比例不适用于x和y坐标。视图沿一个轴快速移动,并沿另一个轴缓慢移动。然后是相反风景方向的逆。 –