我开始构建一个增强现实应用程序,你可以在屏幕上放置一个图像在你的增强现实相机视图,它保持在地球上的那个位置,所以其他人与他们的相机视图可以过来,并看到它在增强现实相机视图。为此,我知道我需要计算一些距离因子以及方位角和仰角。
所以,我已经知道如何将对象的图形发送到服务器并检索它,但是我如何将它放回其原始位置,相对于地球。我知道我需要计算its:
- 海拔
- 方位
- 海拔 距离
但是我该如何计算这些并解释它们/将它们拼凑在一起呢?我希望你明白我的意思。
让我给你一个简短的应用程序演示来完善你的理解:
一个人在他的房子里,他决定在他的一面墙上挂一幅画的图像。他打开默认为增强现实屏幕的应用程序,按下加号键,从他的图片库中添加了一张图片。在幕后,它将位置和位置数据保存到服务器上,有应用程序和增强现实屏幕的人经过,它会到服务器上查找附近保存的图像,然后下载图像并将其放在墙上,这样当另一个人移动它时就可以用手机看到它。我应该采取什么方法来实现这一点?任何大纲,链接,资源,教程,想法,经验等。谢谢!这是一个很难写下来的问题,我希望你能理解。如果没有,请告诉我,我将重写。
罗汉我正在制作两个AR iOS应用程序,它们做以下事情:将方位角(指南针,水平角度)和仰角(陀螺仪,垂直角度)转换为3D空间中的位置(例如球形到笛卡尔)。
你需要的框架是:
- CoreLocation
- CoreMotion
获取地理位置(坐标)对于纬度、经度和海拔来说非常简单。您可以在几个在线资源中轻松找到此信息,但这是在调用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;
}
获取方位角也很简单,在调用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);
}
对于最后一部分,要非常小心角度和轴的命名约定,因为它们因源而异。在我的系统中,θ是水平面上的角度,φ是垂直平面上的角度,x是左右,y是上下,z是前后。
至于距离,我不确定你是否真的需要用它,但如果你需要,那就把它替换为"半径"。
希望有帮助
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)")
}