用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 管道中移除差异计算,并将工作放在本质上可以具有无限精度的程序上。现在精度和准确度会随着您离相机越远而不是离原点越远而下降。
快乐编码。
【讨论】:
你说的以上是关于用OpenGL在大范围内绘制世界地图[WGS84]的主要内容,如果未能解决你的问题,请参考以下文章