在OpenGL中以正确的经纬度在球体上渲染点

在OpenGL中以正确的经纬度在球体上渲染点,opengl,latitude-longitude,Opengl,Latitude Longitude,为了从经纬度数据中获得正确的输出,我一天中的大部分时间都在绞尽脑汁。通过在谷歌地图上绘制数据,我知道这些数据是正确的。例如,我将显示这些lat和long坐标的数据: 经度:4.905396 纬度:52.364643 在谷歌地图中绘制时,它会显示荷兰阿姆斯特丹的正确位置: 现在,当我在应用程序中绘制此图时,它如下所示: 是的,谷歌地图是二维的,我的是三维的,但这只是为了证明经度和纬度值是正确的,所以如果我把它们转换成三维空间的公式是正确的,它们应该出现在同一个点上 我在网上读了很多文章,也读了

为了从经纬度数据中获得正确的输出,我一天中的大部分时间都在绞尽脑汁。通过在谷歌地图上绘制数据,我知道这些数据是正确的。例如,我将显示这些lat和long坐标的数据: 经度:4.905396 纬度:52.364643

在谷歌地图中绘制时,它会显示荷兰阿姆斯特丹的正确位置:

现在,当我在应用程序中绘制此图时,它如下所示:

是的,谷歌地图是二维的,我的是三维的,但这只是为了证明经度和纬度值是正确的,所以如果我把它们转换成三维空间的公式是正确的,它们应该出现在同一个点上

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

这两个人似乎有清晰的解释和很好的例子,但似乎什么都不起作用。我现在正在做的是计算3D空间中的位置,然后对其进行规格化,并使用它作为一个方向,在末端画一条带点的线,正如你在我的应用程序的屏幕截图中看到的那样。这与使用大多数示例中使用的地球半径时,仅从中心到计算位置绘制一条线没有区别

我目前的公式是:

X = r * cos(latitude) * cos(lontitude);
Y = r * cos(latitude) * sin(longitude);
Z = r * sin(latitude);
我知道这是错误的,但是我浏览了我在网上看到的所有例子,没有一个给我正确的数据。通过使用谷歌地图的数据进行测试,我知道至少输入是正确的

更新1:

我检查了纹理的拓扑,这是当其纬度和经度分别为0.0000和0.0000时发生的情况:

这意味着这已经是错误的,但它的偏移量很奇怪,正如谷歌地图所示,它应该是这样的:

绿色箭头是0.0000,0.0000标记。所以我的错了,很明显,它偏了。 我想它可能(不这样认为/希望如此)是纹理,我正在使用这个:

我从以下方面获得:

更新2: 我已经用纹理检查了我的球体的拓扑结构,它似乎在0.0和0.0中处于关闭状态,但我也怀疑我的公式。我在网上尝试了很多不同的公式,其中一些得到了与我的第一个公式相同的0.0 0.0,但很多没有。我的经度和纬度以度为单位,分别为-180~180和-90~90

更新3: 这是阿姆斯特丹的一幅图,有点像0.0 0.0 lat/long piont。我想地图或计算结果都有错。我将尝试调整纹理,使其稍微移动一点。

到目前为止还没有提到,但请确保传递给cos和sin的角度是弧度而不是度

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

然后检查:哪个轴向上?你的公式与Z向上(北极)和X离开屏幕一致(你让地球旋转以看到0,0)

但是,更常见的情况是,在屏幕外渲染Y向上和Z向上的视图


检查纹理坐标是如何生成的,以查看哪个轴与sin一起使用。

是否检查了纹理坐标以确保纹理位于正确的位置?要对齐两个坐标,请使用lat/long=0,0,并使纹理与建模工具内的预期点重合(如果通过代码创建球体,则使用UV贴图代码)。在那之后,你的其他所有lat/long都应该是好的。我们需要看看你是如何给你的球体添加纹理的,以及纹理和纹理加载器的方向。谷歌怎么能在巴西旁边显示
0,0
0,0
显然在赤道上,就在英格兰的正下方。你的
0,0
3d图片看起来很协调纠正我!试试谷歌搜索“大地测量到ECEF”我已经确定了,我在其他一个问题中发现了这一点,但是谢谢!我会被诅咒的,我只是在纸上画出来,你是100%正确的。似乎我把它们弄错了,我现在已经修复了。我必须在Maya中调整我的地球仪的旋转一点,但那很好,现在一切都正确了。非常感谢!