gpt4 book ai didi

ios - 在横向模式下使用 Core Motion

转载 作者:行者123 更新时间:2023-11-29 11:06:22 26 4
gpt4 key购买 nike

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

我不会在这里解释所有的理论,那样会太长。但是对于那些有经验的人来说,我的问题是,我们采用姿态的旋转矩阵将这种旋转应用于我们的坐标。好的,到这里为止都很好,但是 Core Motion 似乎没有将其适应 Landscape Mode。我在这个主题上看到了类似的问题,但看起来没有人有解决方案。

所以我试着自己做,这是我的想法:

每次我们将设备旋转到横向时,都会旋转 +-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 上,它似乎不是典型的旋转矩阵,我找不到任何文档准确说明这个矩阵的不同元素是什么。

最佳答案

我昨天刚刚设法使这个(Apple 的 pARk 示例)适应景观(右),并想分享所做的更改。它似乎工作正常,但请指出任何错误。这仅支持右侧横向,但可能很容易适应左侧。

在 ARView.m 中,

在-(void)initialize中,切换bounds的高宽

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

在-(void)startCameraPreview

[captureLayer setOrientation:AVCaptureVideoOrientationLandscapeRight];

在-(void)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

关于ios - 在横向模式下使用 Core Motion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13432283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com