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正方向向上。然后在视口范围内,将窗口中的物体按照一定的比例关系映射到对应的视口位置。