我目前正在使用增强现实,为此我想使用陀螺仪和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上,它似乎不是一个典型的旋转矩阵,我找不到任何文档明确说明这个矩阵的不同元素。
我po在这里提出了一个类似的问题:http://stackoverflow.com/questions/11906611/augmented-reality-app-in-landscape-mode –
运行这个计算出来吗?这太痛苦了! –