提问人:mike 提问时间:3/13/2012 更新时间:7/11/2012 访问量:1120
增强现实方位角/航向/方位角混淆。(iphone ARKit代码)
Augmented Reality Bearing/Heading/Azimuth confusion. (iphone ARKit code)
问:
- (float)angleFromCoordinate:(CLLocationCoordinate2D)first toCoordinate:(CLLocationCoordinate2D)second {
//first is origin
//second is point
float longitudinalDifference = second.longitude - first.longitude;
float latitudinalDifference = second.latitude - first.latitude;
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference / longitudinalDifference);
if (longitudinalDifference > 0)
{
return possibleAzimuth;
}
else if (longitudinalDifference < 0)
{
return possibleAzimuth + M_PI;
}
else if (latitudinalDifference < 0)
{
return M_PI;
}
return 0.0f;
}
上面的代码(取自开源 ARkit 项目)计算了从兴趣点到原点(用户位置)的角度。给定以弧度计算的方位角(航向),在 AR 应用程序中,我可以使用以下代码检测一个点是否在其视口内:
- (BOOL)viewportContainsCoordinate:(ARCoordinate *)coordinate {
double centerAzimuth = self.centerCoordinate.azimuth;
double leftAzimuth = centerAzimuth - VIEWPORT_WIDTH_RADIANS / 2.0;
if (leftAzimuth < 0.0) {
leftAzimuth = 2 * M_PI + leftAzimuth;
}
double rightAzimuth = centerAzimuth + VIEWPORT_WIDTH_RADIANS / 2.0;
if (rightAzimuth > 2 * M_PI) {
rightAzimuth = rightAzimuth - 2 * M_PI;
}
BOOL result = (coordinate.azimuth > leftAzimuth && coordinate.azimuth < rightAzimuth); //THIS LINE
if(leftAzimuth > rightAzimuth) {
result = (coordinate.azimuth < rightAzimuth || coordinate.azimuth > leftAzimuth);
}
double centerInclination = self.centerCoordinate.inclination;
double bottomInclination = centerInclination - VIEWPORT_HEIGHT_RADIANS / 2.0;
double topInclination = centerInclination + VIEWPORT_HEIGHT_RADIANS / 2.0;
//check the height.
result = result && (coordinate.inclination > bottomInclination && coordinate.inclination < topInclination);
//NSLog(@"coordinate: %@ result: %@", coordinate, result?@"YES":@"NO");
return result;
}
问题是我不完全理解它是如何工作的,特别是在它检查坐标(兴趣点)方位角(航向)是否在原点航向的左右方位角之间的视口范围内的行。
因此,举一个我误解的例子 - 以度为单位,如果坐标(兴趣点)计算出原点的方位角为 90 度,然后原点视口以与坐标成 270 度角的自身方位面向它,这意味着用户正在查看该点,但我不明白为什么代码仍然有效,因为它检查坐标方位角方位是否在原点内我假设的视口是 250 - (270) - 290 度。显然,原点的坐标方位角是 90,所以它应该是错误的。
非常感谢任何帮助了解这里真正发生的事情。
答:
0赞
Nishant Mahajan
7/11/2012
#1
我认为您可以使用像这样的函数
#define degreesToRadians(x) (M_PI * x / 180.0)
这样你根据度数和弧度更清楚。 希望这对你有所帮助..
评论