iOS – 计算距离,方位angular,高程和相对位置(增强现实)

我开始构build增强现实应用程序,您可以在增强现实相机视图的屏幕上放置图像,并将其保留在地球上的这个位置,以便其他人使用相机视图可以在增强现实中看到它现实相机视图。 为此,我知道我需要计算一些距离因子以及方位angular和仰angular。

所以,我已经想出了如何将对象的graphics发送到服务器并将其恢复,但是如何将其放回原来的位置,相对于地球。 我知道我需要计算它的:

  • 高度
  • 坐标
  • 方位
  • 海拔
  • 距离

但是,我将如何计算这些数据,并将它们汇总在一起。 我希望你明白我的意思。

为了使您的理解更加完善,让我给你一个简短的应用程序演示:

一个人在他的房子里,他决定在他的墙上放一幅画。 他打开默认为增强现实屏幕的应用程序,他按下加号button,并添加他的照片库中的图像。 在幕后,它将位置和位置数据保存到服务器上,具有应用程序和增强现实屏幕的用户来到服务器并find保存在附近的图像,然后下载图像并将其放置在另一个人在墙上移动时可以用手机看到墙壁。

我应该采取什么方法来实现这一目标? 任何大纲,链接,资源,教程,想法,经验等谢谢! 这是一个很难记的问题,我希望你能理解。 如果不是,请告诉我,我会reword。

罗汉

我正在做两个AR iOS应用程序,它们执行以下操作:将方位angular(指南针,水平angular度)和高程(陀​​螺仪,垂直angular度)转换为三维空间中的位置(例如球面到笛卡尔)。

你需要的框架是:

  • CoreLocation
  • CoreMotion

获取地理位置(坐标)对于纬度,经度和高度来说是非常简单的。 您可以在几个在线源中轻松find这些信息,但在您调用startUpdatingLocation之后,这是CLLocationManagerDelegate所需的主要调用:

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { latitude = (float) manager.location.coordinate.latitude; longitude = (float) manager.location.coordinate.longitude; altitude = (float) manager.location.altitude; } 

获取方位angular也非常简单,在调用startUpdatingHeading之后使用与该位置相同的委托:

 - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { azimuth = (float) manager.heading.magneticHeading; } 

陀螺仪是从陀螺仪中提取出来的,它没有代表,但也很容易设置。 调用看起来像这样(注意:这适用于我的应用程序运行在横向模式,检查你的):

 elevation = fabsf(self.motionManager.deviceMotion.attitude.roll); 

最后,您可以将您的方向坐标转换为3D点,如下所示:

 - (GLKVector3)sphericalToCartesian:(float)radius azimuth:(float)theta elevation:(float)phi { // Convert Coordinates: Spherical to Cartesian // Spherical: Radial Distance (r), Azimuth (θ), Elevation (φ) // Cartesian: x, y, z float x = radius * sinf(phi) * sinf(theta); float y = radius * cosf(phi); float z = radius * sinf(phi) * cosf(theta); return GLKVector3Make(x, y, z); } 

对于最后一部分,对于angular度和轴命名约定非常谨慎,因为它们从源代码到源代码的变化很大。 在我的系统中,θ是水平面上的angular度,φ是垂直平面上的angular度,x是左右的,y是下降的,z是前后的。

至于距离,我不确定你真的需要使用它,但如果你这样做,那么只是将其replace为“半径”。

希望有所帮助

Swift 3

陀螺仪代码更新:

 import CoreMotion ... motionManager.deviceMotionUpdateInterval = 0.1 motionManager.startDeviceMotionUpdates(to: OperationQueue.current!) { deviceManager, error in guard let dm = deviceManager else { return } let roll = dm.attitude.roll let pitch = dm.attitude.pitch let yaw = dm.attitude.yaw print("r: \(roll), p: \(pitch), y: \(yaw)") }