用OpenGL在大范围内绘制世界地图[WGS84]

Posted

技术标签:

【中文标题】用OpenGL在大范围内绘制世界地图[WGS84]【英文标题】:Draw World Map [WGS84] with OpenGL in a wide Range 【发布时间】:2010-02-02 00:15:01 【问题描述】:

我想绘制一张地图,由 256x256 像素块(其中 很多 个)组成。这些覆盖了一个区域。

将 lat|lon(从地球)转换为 x|y(地图)的转换产生了相当大的值。 有了这些大的值就会变得准确,因此,如果我远离 0/0 点,我会得到两个相邻的瓷砖纹理之间的多个像素的不准确性(例如 2E8 | 0 和 2E8-1 | 0)。

如何解决这些杂乱无章的不需要的网格外观?当前失败的实现是使用 float 来绘制图元(这应该无关紧要,因为所有 Tiles 在两个坐标方向上都被裁剪为 256 的倍数)。

注意:我已经尝试使用 glTranslated 进行偏移,但是 double 的精度也不够,或者这不是故障的原因。

【问题讨论】:

对此投了反对票。原因?评论? 【参考方案1】:

实际上,我最近在将整个行星从太空渲染到地面时遇到了完全相同的问题。事实上,你要做的就是创建一个新的位置结构,在不同的浮点数之间分割精度。例如,

struct location

     vec3 metre;
     vec3 megametre;
     vec3 terametre;
     vec3 examtre;
     vec3 yottametre;
;

然后为这个结构(+、-、*、/、toVec3)编写所有运算符和类型转换函数,然后使用这个位置结构来编码你的相机和每个网格图块的位置。在渲染时,您不平移相机,而是按差异平移图块。例如:

void render()

     // ...
     location diff = this->position - camera.position;
     vec3 diffvec = diff.toVec3();
     glPushMatrix();
     glTranslatef(diffvec.x, diffvec.y, diffvec.z);

     // render the tile
     glPopMatrix();

它的作用是从只有双精度的 OpenGL 管道中移除差异计算,并将工作放在本质上可以具有无限精度的程序上。现在精度和准确度会随着您离相机越远而不是离原点越远而下降。

快乐编码。

【讨论】:

你说的是什么意思,相机位置的原点还是最后一点?非常感谢您的回答 它是用C++编写的,函数render()属于瓦片类或结构,因此这是一个指向正在渲染的瓦片的指针。所以 this->position 是当前正在渲染的 tile 的类型 location 的位置。 非常感谢 :) 你真的帮我走出了泥潭……继续编码

以上是关于用OpenGL在大范围内绘制世界地图[WGS84]的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图是否WGS84坐标系

地图坐标系的转换

bd09坐标转wgs84

如何wgs84与当地坐标之间的转换参数

WGS84 到 Google 地图位置和返回的 Java 代码

验证sql server上几何字段内的点(WGS84)