将gps坐标转换为AR中的opengl字

时间:2012-01-10 11:33:28

标签: ios gps latitude-longitude augmented-reality coordinate-transformation

我有一个gps坐标列表(长,纬度),我有我当前的位置(长,纬度)。 我发现通过减去两个坐标,我找到了我位置的相对坐标,以及我在AR应用程序中使用的坐标,用于在opengl世界中绘制pois。

问题是遥远的坐标仍然太远而不能“看”,所以我想要一个方程将所有东西都转化为接近我的位置,但是它们的原始相对位置。

double kGpsToOpenglCoorRatio = 1000;
    - (void)convertGlobalCoordinatesToLocalCoordinates:(double)latitude x_p:(double *)x_p longitude:(double)longitude y_p:(double *)y_p {

        *x_p = ((latitude - _userLocation.coordinate.latitude)   * kGpsToOpenglCoorRatio);
        *y_p = ((longitude - _userLocation.coordinate.longitude) * kGpsToOpenglCoorRatio);

    } 

我尝试使用Square root来给他们一个“距离限制”,但他们的位置相对于原来的位置搞砸了。

2 个答案:

答案 0 :(得分:3)

这可能是因为GPS使用球形(ish)坐标系,而您正试图将其直接映射到笛卡尔坐标系(平面)。

您可以做的是将GPS坐标转换为本地参考平面,而不是直接映射它们。如果您将自己的位置视为坐标系的原点,则可以通过使用位置和位置之间的大圆距离(r)和方位角(θ)来获取地平面上相对于原点和真北的点的极坐标。远程坐标,然后使用(x,y)=(r * cos(theta),r * sin(theta))将其转换为笛卡尔坐标。

对于你的情况再次更好,一旦你有一个大圆圈轴承,你可以缩短r(距离)。这将在x和y中将点拖动到更靠近你的位置,但是它们仍然处于正确的相对方位,你只需要以某种方式指出这一点。

另一种方法是缩放您可视化的对象的大小,以便它们随距离变大以补偿透视。这样您就可以直接使用正确的位置和方向。

此页面包含方位/距离算法:http://www.movable-type.co.uk/scripts/latlong.html

答案 1 :(得分:0)

我最终使用截取圆圈的gps坐标方程解决它我想要所有的pois出现,它完美地工作。我没有在任何地方使用轴承。 以下是有兴趣的代码:

- (void)convertGlobalCoordinatesToLocalCoordinates:(double)latitude x_p:(double *)x_p longitude:(double)longitude y_p:(double *)y_p {

    double x = (latitude - _userLocation.coordinate.latitude) * kGpsToOpenglCoorRatio;
    double y = (longitude - _userLocation.coordinate.longitude) * kGpsToOpenglCoorRatio;

    y = (y == 0 ? y = 0.0001 : y);
    x = (x == 0 ? x = 0.0001 : x);

    double slope = x / ABS(y);

    double outY = sqrt( kPoiRadius / (1+pow(slope,2)) );
    double outX = slope * outY;

    if (y < 0) {
        outY = -1 * outY;
    }

    *x_p = outX;
    *y_p = outY;
}