在OpenGL中使用正确的经度和纬度在地球上渲染点

时间:2012-07-16 20:26:18

标签: opengl latitude-longitude

在从经度和纬度数据获取正确输出的那一天中,我一直在打破我的头脑。通过在谷歌地图中绘制数据,我知道这些数据是正确的。例如,我将显示这些lat和long坐标的数据: 经度:4.905396 纬度:52.364643

在谷歌地图中绘制时,它显示了荷兰阿姆斯特丹的正确位置: PLotting location of amsterdam on gmaps

现在,当我在我的应用程序中绘制它时,它看起来如下: selfmade app showing location

是的谷歌地图是2D表示,我的是3D,但这只是为了证明经度和纬度值是正确的,所以如果我将它们转换为3D空间的公式是正确的,它们应该出现在同一个地方。 / p>

我一直在阅读网上的很多文章以及stackoverflow本身。 我已经阅读了这些文章,并应用了我所看到的所有不同类型的公式:

Convert Latitude and Longitude to point in 3D space

3D coordinates on a sphere to Latitude and Longitude

这两个似乎有清晰的解释和良好的例子,但似乎没有任何作用。我现在正在做的是计算3D空间中的位置,然后对其进行标准化,并将其用作在末尾绘制带点的线的方向,如我在应用程序的屏幕截图中所示。当使用在大多数示例中使用的地球半径时,这与仅从中心到计算位置的绘制线没有区别。

我目前的公式是:

X = r * cos(latitude) * cos(lontitude);
Y = r * cos(latitude) * sin(longitude);
Z = r * sin(latitude);

我知道这是错的,但我已经浏览了我在网上看到的所有例子,没有人向我展示正确的数据。通过使用谷歌地图的数据进行测试,我知道至少输入是正确的。

UPDATE1:

我检查了纹理的拓扑结构,当纬度和经度为0.0000和0.0000时会发生这种情况: Latitude and longitude check with 0.0000 and 0.0000

所以这意味着这已经错了,但它有一个奇怪的偏移,因为谷歌地图显示它应该是这样的: google maps latitude and longitude 0.0000, 0.0000

绿色箭头为0.0000,0.0000标记。所以我的很明显,它偏离了一边。 我想它可能(不要想/希望如此)是纹理,我正在使用这个: http://naturalearth.springercarto.com/ne3_data/16200/textures/2_no_clouds_16k.jpg

我从Shadedrelief Natural Earth textures

获得的

更新2: 我已经用纹理检查了我的球体的拓扑结构,似乎是0.0和0.0的关闭,但我也怀疑我的公式。我尝试了很多不同的网络,其中一些得到的0.0 0.0与我的第一个公式相同,但很多都没有。我的经度和纬度在-180~180和-90~90之间。

更新3: 这是阿姆斯特丹的一个情节的视图,它的一点点,就像0.0 0.0纬度/长的piont。在某个地方我想是地图或计算错了。我会尝试调整纹理以稍微移动一下。 almost fixed

2 个答案:

答案 0 :(得分:5)

首先必须以弧度为单位,而不是度数。

然后检查:哪个轴已启动?你的公式与Z向上(北极)和X在屏幕外是一致的(你有地球旋转看到0,0)

然而,在屏幕上显示Y up和Z的视图更为常见。

检查如何生成纹理坐标以查看sin使用哪个轴。

答案 1 :(得分:1)

到目前为止还没有提到过,但要确保你的角度传递给cos和sin是弧度而不是度http://en.cppreference.com/w/cpp/numeric/math/cos