这是最基本,最复杂,最重要的一章,各种乱七八糟变换,一个场景最经典的比喻是照相机比喻,引用如下:
(1) 将相机固定在三脚架上,并使之对准场景(视点变换)
以下是glOrtho的参数图:
最后是视口变换,其实说白了就是选择把场景画在哪儿,画多大,是画整个屏幕呢,还是只是屏幕中的一小块角落里面。不涉及到矩阵操作,直接使用 glViewport函数就可以搞定了
(1) 将相机固定在三脚架上,并使之对准场景(视点变换)
(2) 让要拍摄的场景位于取景框中合适的位置(模型变换)
(3) 选择相机镜头或调整放大倍数(投影变换)
(4) 决定照片的大小,放大照片还是缩小照片, 把图形画下来,是要占据整个屏幕还是屏幕的一部分(视口变换)。
具体如图:
其中视点变换和模型变换是联系在一起的,设置模型视图矩阵, glMatrixMode( GL_MODELVIEW)。视点变换往往使用gluLookAt函数。
模型变换也设置glMatrixMode( GL_MODELVIEW),主要设计三个函数:平移glTranslate, 旋转glRotate, 缩放glScale
投影变换自然是操作投影矩阵,glMatrixMode( GL_PROJECTION)。分为两种:正投影和透视投影。
正投影往往在工程项目中应用,显示一个四四方方的切面。glOrtho来指定一个正交平行的矩形,屏幕上显示的就是此物体在此矩形的正面的投影。gluOrtho2D实际上是此函数的一个去掉Z轴坐标的简化版,而glOrtho包括的参数 nearVal,farVal表示此矩形的前,后两面,超出此矩形范围的图形将会被裁掉。
透视投影使用glFrustum或者gluPerspective函数,二选一,效果都是一样的。
以下是glFrustum的参数图:
以下是glPerspective的参数图:
以下是glOrtho的参数图:
最后是视口变换,其实说白了就是选择把场景画在哪儿,画多大,是画整个屏幕呢,还是只是屏幕中的一小块角落里面。不涉及到矩阵操作,直接使用 glViewport函数就可以搞定了