Opengl和windows的逻辑坐标到设备坐标转换的理解

来源:互联网 发布:小米6相机数据怎么清除 编辑:程序博客网 时间:2024/04/29 19:18

1.绘图操作涉及到窗口,视口,屏幕几个概念(窗口是逻辑坐标,视口是设备坐标,是屏幕的一部分)。在opengl和windows中,窗口,和视口的定义是有所区别的。

opengl中,窗口是在世界坐标系中定义的一个矩形框,也就是投影面。视口是在显示窗口中定义的一个矩形框,窗口中的物体完全投影到视口中。而视口之外的窗口区域将不进行绘图操作。窗口与视口的转换公式如下:

xViewport   =   (xWindow   -   xWinOrg)*xViewExt/xWinExt   +   xViewOrg    

yViewport   =   (yWindow   -   yWinOrg)*yViewExt/yWinExt   +   yViewOrg   

  (xWindow,yWindow)是待转换的逻辑点,  

  (xViewport,yViewport)是转换后的设备坐标。  

(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围

opengl严格按照此公式进行窗口与视口的转换。xWinExt,yWinExt,xViewExt,yViewExt就是根据窗口计算出来的长度。当使用opengl绘图时,我们设置分别设置窗口和视口的位置和大小(设置两个矩形区域,包括起始点、宽、高),然后在窗口中绘图,其图像的显示就是将窗口中的图像映射到物理坐标中的视口中。(opengl是窗口到视口的映射,也是原点到原点的映射,因为opengl中原点是定义在窗口/视口的左下方的)


windows中,逻辑坐标转换为物理坐标,也是使用的上面的计算公式。在逻辑坐标中设置窗口原点,在设备坐标中设置视口原点后,映射时窗口的原点映射到视口的原点,然后按照窗口和视口的比例进行大小的转换而已(MM_TEXT是1:1,MM_LOMETRIC是3:1...)。而窗口和视口的比例就是设置xviewExt/xWinExt与yViewExt/yWinExt。opengl中此比例关系是根据我们规定的窗口自动计算出来的,但在windows中,是我们自己设定的。(windows中是原点到原点的映射,而窗口与视口的概念是虚拟的,我们需要的只是设置其比值。)(opengl中是原点到原点的映射,但是不一定是窗口到窗口的映射,因为windows中的原点并不是定义在窗口和视口的左下角,他们的位置关系是任意的)。

通常我们绘图都是希望在逻辑坐标中的窗口中的图像映射到视口中,所以我们可以根据窗口的位置和视口的位置,来调整设置窗口原点和视口原点的位置,使得最终也是窗口映射到视口



为了便于理解在窗口中绘制的图像哪些部分可以显示在视口中,我们通常会进行如下判断:

opengl中,在窗口中绘制的图像就会显示在视口中,超出窗口的将被剪裁。

windows,将窗口坐标原点跟视口坐标原点重合。x正方向都像右,根据不同的映射模式,y方向有所不同。MM_TEXT下,窗口y正方向向下,其他y正方向向上。然后在视口范围内,将窗口中的物体按照一定的比例关系映射到对应的视口位置。

原创粉丝点击