根据OpenGL中的屏幕坐标绘制线条

时间:2013-10-12 06:46:58

标签: java android opengl-es-2.0

我有一个我在OpenGL-ES 2.0中创建的2D地图。现在我想画一个比例尺。

当用户平移地图时,不会移动它,我需要以某种方式在屏幕坐标中绘制它。

我可以就如何完成这样的事情使用一些建议。

1 个答案:

答案 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以及如何更好视口映射在长期运行中起作用:)