使用OpenGL在很宽的范围内绘制世界地图[WGS84]

时间:2010-02-02 00:15:02

标签: c++ opengl map

我想绘制一张地图,包含256x256像素图块(一个很多)。这些包含 big 区域。

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

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

注意:我已经尝试使用glTranslate d 进行偏移,但是双倍的精确度还不够,或者这不是毛刺的原因。

1 个答案:

答案 0 :(得分:4)

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

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管道中移除差异计算,该管道只有两倍的精度,并且可以将程序的工作放在基本上具有无限精度的程序上。现在精度和准确度越来越远离相机,而不是距离相机越远。

快乐编码。