放大问题

Zoom in problems

我的应用程序是一张有一些形状的世界地图。用户可以拖动和缩放地图进行导航。

世界边界坐标为minX=-180 minY=-90 maxX=180 maxY=90。 我的形状顶点也在这个坐标范围内。

我使用正交投影将世界映射到屏幕上。 当用户拖动或缩放时,我只是用新的可见地图边界更改矩阵。

应用程序运行良好,用户可以缩放和拖动地图。形状相应地移动。

我用lighgl作为第三方

当用户放大 allot 时会出现问题,然后我的形状顶点开始摇晃并在某个点消失。 我很确定这是一个浮动精度问题。因为当我们放大可见区域时,边界非常小——例如。 minx:30.0001 - maxX: 30.0002, y.

我的着色器是基本着色器,如下所示:

顶点着色器

uniform mat4 gl_ModelViewProjectionMatrix;    
attribute vec4 gl_Vertex;
 
void main() {
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

片段着色器

void main() {
  gl_FragColor = vec4(1.,0.,0.,1.);
}

我正在寻找这个问题的数学或 webGL 解决方案..

尝试 1:

我试图按因子缩放所有内容,但由于某种原因它不起作用。

例如。而不是映射 minX:30.001 它将映射 minx:3000.1 - 因子 100(其余边界值依此类推)。在我的着色器中,我将 gl_Vertex 乘以这个因子。但是看起来是一样的。

经过多次尝试并检查浮点位的工作原理后,我意识到当我的浮点值在 -1 到 1 之间时,精度非常高。大约 +/-1.e-45

所以我基本上做的是将我的映射偏移到原点 - 我的中间点将是 (0,0)。等等顶点进入着色器。

例如。 如果我们的世界地图显示 30.99999999030.999999996 之间的区域(在 X 和 Y 中),那么映射这个值将基本上映射圆形值 - 4040 由于浮动精度。

为了解决这个问题,我们如前所述偏移原点。 这意味着,30.999999993 是映射值的中间值,我用它来减少它们。 现在映射 -0.0000000030.000000003 - 此值在浮点数中是可接受的。

我们的整数(如果这是正确的词)是 0,因此现在有更多位可用于小数。

在着色器中,我还从我的顶点中减少了这个中间值 (30.999999993)..

希望对这个答案有所帮助。

我用这个 link 来帮助我理解