Nehe学习笔记二

来源:互联网 发布:ibm云计算解决方案 编辑:程序博客网 时间:2024/04/29 10:20

第二课内容不多,就是在平面上画了个三角形和一个矩形。代码的改动很简单,只是在第一课的基础上修改了DrawGLScene函数。

     如果第一课一块黑屏的程序让你提不起劲,那这个程序画的2个图形或许可以激发一点你的困惑和疑问。为什么这两个图形画在这里?

     下面来简单的分析一下ReSizeGLScene函数,这个函数是在每次窗口大小被调整后调用的。他做了些什么呢?viewport重新定义视窗大小,参数(x,y,width,height),分别意义是窗口左下角的x,y点,窗口的width和height。一般来说,x,y都为0,width和height就是创建窗口的大小。但是如果不是这样呢?试着修改width,和height为窗口的一半大小,

1) glViewport(0,0,width>>1,height>>1);

试验着改变x,y的坐标值

2) glViewport(20,20,width,height);

第一个实验你会发现,三角和矩形到了左下角,并且大小变为原来的一半了,第二个实验你会发觉,三角和矩形都向右边移动了20个像素单位。想不明白的话还是查msdn吧J。这里面有2个概念,一个是世界坐标,一个是屏幕坐标。glViewport就是通过标准化设备坐标(normalized device coordinates)来是建立这两者之间一个映射关系的。所谓标准化设备坐标就是把一个窗口区域映射到一个1x1大小的区域,这样,世界坐标里面要画的内容就可以搬运到屏幕坐标上面去了。

     因此,试验一的结果就是把一块640*480的图片映射到320x240的视窗区域。然后图片的左下角与窗口的(0,0)重合,试验二的结果就是把一块640*480的图片映射到同样是640*480的视窗区域,但是图片的左下角与窗口的(20,0)重合,这样三角形和矩形就整体向右移动了20个像素。

     看完了glviewport,然后看重置投影矩阵和模型观察矩阵, 3D图形学里面我们所要设计的两种基本投影方式:平行投影和透视投影。在重置投影矩阵后,通过gluPerspective函数设置透视投影矩阵。如果你想要一个平行投影,你可以调用glOrtho函数来设置平行投影矩阵。如果你要画一个2D的图像,用不到Z轴信息,你可以通过调用gluOrth2D来创建一个2维平面。其实gluOrtho2D(left,  right,  bottom,  top)等价与glOrtho((left,  right,  bottom,  top, 1, 1)

要注意的是,不管gluPerspective还是glOrtho,都是相当于对当前矩阵进行一次乘法运算。所以调用一次和调用两次的结果大多数情况下是完全不一样的!每次进行投影设置前,要调用glLoadIdentity来把当前矩阵恢复为单位矩阵。(其实在openGl里面对任何矩阵的操作都一样)

     画图部分就不怎么介绍,如果你了解了透视投影矩阵的概念,应该会明白的比较轻松,不了解的google下吧。