iOS - 计算距离,方位角,高度和相对位置(增强现实)

MCK*_*pur 9 iphone xcode objective-c augmented-reality ios

我开始构建一个增强现实应用程序,您可以在增强现实摄像机视图的屏幕上放置一个图像,它保持在地球上的那个位置,所以其他人用他们的摄像头视图可以来到并在增强的上看到它现实相机视图.为此,我知道我需要计算某种距离因子以及方位角和仰角.

所以,我已经想出如何将对象的图形发送到服务器并将其检索回来,但是如何将它放回到相对于地球的原始位置.我知道我需要计算它:

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

但是我如何计算这些并将它们计算在一起/将它们拼凑在一起.我希望你明白我的意思.

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

一个男人在他家里,他决定在他的一面墙上画一幅画.他打开了默认为增强现实屏幕的应用程序,按下加号按钮并从他的照片库中添加图像.在幕后,它将位置和位置数据保存到服务器,有应用程序及其增强现实屏幕的人来到,它上升到服务器并找到附近保存的图像,然后下载图像并将其放置在在他移动的时候,另一个男人可以用手机看到它.

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

罗汉

Ric*_*eda 18

我正在开发两个AR iOS应用程序,它们执行以下操作:将方位角(罗盘,水平角度)和高程(陀​​螺仪,垂直角度)转换为3D空间中的位置(例如球形到笛卡尔).

您需要的框架是:

  • CoreLocation
  • CoreMotion

获取地理位置(坐标)对于纬度,经度和海拔非常简单.您可以在多个在线资源中轻松找到此信息,但这是CLLocationManagerDelegate您致电后需要的主要电话startUpdatingLocation:

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

获得方位角也非常简单,使用相同的委托作为调用后的位置startUpdatingHeading:

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

从陀螺仪中提取高程,陀螺仪没有代表,但也很容易设置.电话看起来像这样(注意:这适用于我在横向模式下运行的应用,请检查你的):

elevation = fabsf(self.motionManager.deviceMotion.attitude.roll);
Run Code Online (Sandbox Code Playgroud)

最后,您可以将方向坐标转换为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);
}
Run Code Online (Sandbox Code Playgroud)

对于这最后一部分,要非常警惕角度和轴命名约定,因为它们在源与源之间变化很大.在我的系统中,θ是水平面上的角度,φ是垂直平面上的角度,x是左右,y是下行,z是前后.

至于距离,我不确定你真的需要使用它,但如果你这样做,那么只需用它代替"半径".

希望有所帮助

  • 谢谢,非常有价值的答案.我会更多地了解并回复你.我可能需要距离,所以当你离得更远时我可以缩小图像.你的意思是用"半径"代替它?那会有用吗?如果可能的话,你也可以指向一个使用这个/类似代码的资源,所以我可以看到它实际上正在使用中吗? (2认同)
  • 定向光是什么意思?我知道它与我无关,但只是问(听起来很酷)......所以我在这里得到了我的3D点,我怎样才能获得我的3D点并在区域/位置上绘制图像?我检索坐标,高度,方位角和高程,然后如何绘制它?另一件事是,图像可能是屏幕中心的小图像.那么我如何将图像绘制回地球上的位置,而且还要相对于屏幕的位置呢?还有一个问题,这些计算是否非常准确?如果我把它拉回来,它会给出一个准确的位置吗? (2认同)
  • 定向光是一种常见的3D CG物体,可以很好地模拟直射阳光 - 它是无限远的,并且只能发射平行光线.听起来你还有很多设计基础需要覆盖,所以除非我开始仔细研究你的实施细节和最终目标,否则很难给出更多的建议.根据个人经验,相对于屏幕的位置是最棘手的,并且将在很大程度上取决于您如何定义您的比例和距离(例如,当用户何时"足够接近"?).数学是数学,任何不准确都将在于传感器:) (2认同)