gpt4 book ai didi

ios - 基于后置摄像头的 CoreLocation 航向(增强现实)

转载 作者:可可西里 更新时间:2023-11-01 03:26:42 25 4
gpt4 key购买 nike

我想创建一个将对象指向一个方向的增强现实 View 。但是,当您使用相机面朝上时,CoreLocation 航向无法正常工作(例如,当您位于底层时,朝向 20 层楼的顶部)。

它给出了相反的方向(可能是手机顶部指向的方向)。

我已经尝试了几种方法让它在相机指向的方向上工作,例如:

1、设备方向>45度时+180度(不够准确,方向突然偏离10~20度)

2,尝试使用 CMMotionManager 和以下教程中的公式进行计算。 http://www.loveelectronics.co.uk/Tutorials/13/tilt-compensated-compass-arduino-tutorial .

3,尝试使用ios deviceMotion.magneticField 和deviceMotion.gravity 模拟来自android 的逻辑。

4、使用旋转矩阵(stack overflow中的一些其他帖子,但不准确)

    double heading = M_PI + atan2(self.altitudeData.rotationMatrix.m22, self.altitudeData.rotationMatrix.m12);
heading = heading*180/M_PI;

我已经想不出还有什么办法可以让它变得正确。我知道有一些应用程序(一些可以看到太阳和星星的应用程序)正在正确执行此操作。

最佳答案

经过大量研究和测试。我最终使用 GLKit 进行计算,因为它也为我省去了很多麻烦。把它留在这里,留给碰巧碰到这个问题的人。

首先,我使用 CMAttitudeReferenceFrameXTrueNorthZVertical 启动了 CMMotionManager 设备运动更新。

self.hasMotion = NO;
CMMotionManager *cmmotionManager = [[CMMotionManager alloc] init];
[cmmotionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:[[NSOperationQueue alloc] init]
withHandler:^ (CMDeviceMotion *motion, NSError *error) {
self.hasMotion = YES;


}];
self.motionManager = cmmotionManager;

根据我在网上找到的一些代码,使用 CoreMotion 旋转绘制一个 openGL 世界,并将其与从屏幕到 3D 世界的点混合:

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(45.0f), aspect, 0.1f, 100.0f);

CMRotationMatrix r = self.motionManager.deviceMotion.attitude.rotationMatrix;
GLKMatrix4 camFromIMU = GLKMatrix4Make(r.m11, r.m12, r.m13, 0,
r.m21, r.m22, r.m23, 0,
r.m31, r.m32, r.m33, 0,
0, 0, 0, 1);

GLKMatrix4 viewFromCam = GLKMatrix4Translate(GLKMatrix4Identity, 0, 0, 0);
GLKMatrix4 imuFromModel = GLKMatrix4Identity;
GLKMatrix4 viewModel = GLKMatrix4Multiply(imuFromModel, GLKMatrix4Multiply(camFromIMU, viewFromCam));
bool isInvertible;
GLKMatrix4 modelView = GLKMatrix4Invert(viewModel, &isInvertible);

int viewport[4];
viewport[0] = 0.0f;
viewport[1] = 0.0f;
viewport[2] = self.view.frame.size.width;
viewport[3] = self.view.frame.size.height;

bool success;
//assume center of the view
GLKVector3 vector3 = GLKVector3Make(self.view.frame.size.width/2, self.view.frame.size.height/2, 1.0);
GLKVector3 calculatedPoint = GLKMathUnproject(vector3, modelView, projectionMatrix, viewport, &success);
if(success)
{
//CMAttitudeReferenceFrameXTrueNorthZVertical always point x to true north
//with that, -y become east in 3D world
float angleInRadian = atan2f(-calculatedPoint.y, calculatedPoint.x);
return angleInRadian;
}

关于ios - 基于后置摄像头的 CoreLocation 航向(增强现实),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17917016/

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