我有一个我在OpenGL-ES 2.0中创建的2D地图。现在我想画一个比例尺。
当用户平移地图时,不会移动它,我需要以某种方式在屏幕坐标中绘制它。
我可以就如何完成这样的事情使用一些建议。
答案 0 :(得分:1)
要执行此操作,您需要知道的只是视口的尺寸。知道视口转换是一个非常简单的缩放和偏移操作,它实际上是这样的:
NDC Screen
--- ------
-1.0 -> x \_ X (Passed using glViewport (...))
1.0 -> x + width /
-1.0 -> y \_ Y (Passed using glViewport (...))
1.0 -> y + height /
-1.0 -> near \_ Z (Passed using glDepthRange (...))
1.0 -> far /
我为丑陋的ASCII艺术道歉,我希望Stack Overflow支持LaTeX。
换句话说,对于X和Y,标准化设备坐标(NDC)会缩放以适应多个单位的宽度和高度, 最左下角 点由(x,y)定义。对于您可能不关心的Z,NDC将从您定义的近似值缩放到定义的远值。
您要做的是反向视口映射操作;从屏幕空间坐标开始,然后回到NDC。
NDC X =(2.0 *(Screen X - Viewport X )/ Viewport W ) - 1.0;
NDC Y =(2.0 *(Screen Y - Viewport Y )/ Viewport H ) - 1.0;
这应该为您提供从Screen (X,Y)生成NDC (X,Y)坐标的所有必要步骤。获得NDC坐标后,可以使用模型,视图和投影的标识矩阵将它们直接传递给着色器。
另一种方法是跳过所有这一切并使用正交投影矩阵,该矩阵定义投影和窗口(屏幕空间的另一个名称)坐标之间的1:1映射,但我认为教NDC以及如何更好视口映射在长期运行中起作用:)