我正在开发两个 AR iOS 应用程序,它们执行以下操作:将方位角(罗盘、水平角)和仰角(陀螺仪、垂直角)转换为 3D 空间中的位置(例如球面到笛卡尔)。
您需要的框架是:
对于纬度、经度和高度,获取地理位置(坐标)非常简单。您可以在多个在线资源中轻松找到此信息,但这是您在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;
}
获取方位角也非常简单,在调用后使用与位置相同的委托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 是前后。
至于距离,我不确定你是否真的需要使用它,但如果你这样做了,那就用它代替“半径”。
希望有帮助