裁剪区视见区和物理窗口的关系

来源:互联网 发布:上海淘宝培训机构 编辑:程序博客网 时间:2024/04/30 21:41

看红宝书的前几章,有一个函数一直不明白是什么意思,做什么用的:glOrtho,只知道在窗口大小变化的时候调用的,如果没有这个,绘制的图形将会变形。至于为什么会变形,一直没有搞明白。就是知道会变形,但是不知道会变成什么样子。

后来再次看前几章的内容,重新看了关于裁剪区和视见区的内容,才若有所悟,书读三遍,其义自现。这句话还是有道理的。

裁剪区:

窗口在物理上是以像素数来测量的。开始在窗口中画点、线或图形之前,必须告诉OpenGL如何把指定的坐标对转换成屏幕坐标。为了做到这一点,先指定窗口在笛卡尔空间中占据的区域,这一区域称为“裁剪区”。在二维空间中,裁剪区是窗口内最小和最大的x值和y值。另一个方法是指定原点相对于窗口的位置。如下图所示:


视见区:

以像素计算的话,裁剪区的宽度和高度很少会恰好与窗口的宽度和高度一致。所以坐标系必须以逻辑笛卡尔坐标映射为物理屏幕的像素坐标。这种映射是由称为”视见区“的设置指定的。视见区是窗口的客户区用于绘制裁剪区的区域。视见区只是把裁剪区映射为窗口的一个区域。通常把视见区定义为整个窗口,但是有时候只想在窗口的下半部分绘图。

如下图所示,物理窗口大小为300×200像素,其视见区定义为整个窗口区域,即300×200.如果把这个窗口的裁剪区设置为x轴上的0-150和y轴上的0-100,那么逻辑坐标就应该映射为可见窗口中一个较大的屏幕坐标系:即这个逻辑坐标系的一个单位增量对应于该窗口物理坐标系统中的两个单位增量,即两个像素。


如果,保持上图中的物理窗口大小不变,将视见区的大小设置为裁剪区大小,即150×100,则可见区域只占该物理窗口的左下部分,如下图所示:


所以,你可以用视见区来缩小或者放大窗口内的图像,把视见区设置的比窗口的客户区还大,就可以在整个物理窗口只显示一部分裁剪区,这里自动脑补。

这个时候问题来了(不是挖掘机技术哪家强),如果我们在渲染的时候,变化物理窗口的大小,比如拉大或者缩小。这个时候,如果视见区不变的话,那么裁剪区内的图像将会产生变形,想一想,视见区大小不变,但是物理窗口大小变了,逻辑坐标系的一个单位对应物理窗口的单位多少也变了,这样在逻辑坐标系中的正方形就不是正方形了,圆也不是正圆了。如下图,逻辑坐标系裁剪区大小还是150×100,位于裁剪区中间有一个矩形,但是视见区的大小不变(相对于以上两个图形),还是300×200,注意这时物理窗口由于某些因素已经变化了,这个时候的对应关系就变成了:


视见区:300×200,裁剪区:150×100,物理窗口实际大小:300×400(下图),那么中间的矩形(图中没有标出,在坐标系内部)大小为75×50。

x方向映射到物理窗口大小:

75*(300*/150)*(300/300) = 150;

y方向映射到物理窗口大小:

50*(200/100)*(400*200) = 200;

看到产生什么变化了吧,矩形的形状变了(宽高比),这样图形就产生了形变。

所以,我们看到,视见区其实相当于一个中介或者媒介,用于正确地将逻辑坐标系转换到物理坐标系。

所以,一旦当窗口大小发生变化时,视见区的大小要重新定义。OpenGL里的glOrtho,具体用法先不说了,网上有很多资料。

0 0
原创粉丝点击