放大问题
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.999999990
到 30.999999996
之间的区域(在 X 和 Y 中),那么映射这个值将基本上映射圆形值 - 40
到 40
由于浮动精度。
为了解决这个问题,我们如前所述偏移原点。
这意味着,30.999999993
是映射值的中间值,我用它来减少它们。
现在映射 -0.000000003
到 0.000000003
- 此值在浮点数中是可接受的。
我们的整数(如果这是正确的词)是 0
,因此现在有更多位可用于小数。
在着色器中,我还从我的顶点中减少了这个中间值 (30.999999993
)..
希望对这个答案有所帮助。
我用这个 link 来帮助我理解
我的应用程序是一张有一些形状的世界地图。用户可以拖动和缩放地图进行导航。
世界边界坐标为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.999999990
到 30.999999996
之间的区域(在 X 和 Y 中),那么映射这个值将基本上映射圆形值 - 40
到 40
由于浮动精度。
为了解决这个问题,我们如前所述偏移原点。
这意味着,30.999999993
是映射值的中间值,我用它来减少它们。
现在映射 -0.000000003
到 0.000000003
- 此值在浮点数中是可接受的。
我们的整数(如果这是正确的词)是 0
,因此现在有更多位可用于小数。
在着色器中,我还从我的顶点中减少了这个中间值 (30.999999993
)..
希望对这个答案有所帮助。
我用这个 link 来帮助我理解