OpenGL中的变换都是基于矩阵运算,将各种变换的矩阵作用在顶点坐标上而产生不同的效果。
视图变换:设置场景中视景体的位置
模型变换:设置场景中模型的位置
投影变换:确定视景体的形状
视口变换:确定最终成像的大小
注:代码中,视图变换应在模型变换之前(这很好理解,只有先选好了看哪里,才能去摆弄那里的东西);而视口变换和投影变化只要在绘制之前执行就行了。
OpenGL执行各变换的大概的流程为:
物体坐标
------->模型视图矩阵:视图变换和模型变换组成(同时,用于从场景中删除某些物体或者提供物体的裁剪视图其他裁剪平面也生效)
------->视觉坐标
------->投影矩阵:定义了视景体的大小,视景体之外的物体被裁剪掉。
------->裁剪坐标
------->透视除法:坐标(x,y,z,w)---->(x/w,y/w,z/w)
------->规范化的设备坐标
------->视口变换:可以控制视口大小从而放大缩小拉伸图形。
------->窗口坐标。
OpenGL绝大多数变换是把当前矩阵与变换矩阵相乘,得到新的当前矩阵。
视图变换
使用前应将设置当前矩阵为单位矩阵,glLoadIdentity();
然后使用gluLookAt()进行视图变换。参数共9个,每三个一组,分别为:眼睛位置,瞄准方向,向上的方向。
模型变换
对模型位置、方向设置:旋转、移动、缩放等。
如:glScalef(),glRotatef(),glTranslatef()等。
投影变换
OpenGL有两种基本类型的投影:
透视投影:远处的物体会更小,和日常经验类似。
正投影:直接将物体映射到屏幕上,反映的是实际的大小。一般用于CAD应用程序中。
使用时,先调用glMatrixMode(GL_PROJECTION); glLoadIdentity();
再用glFrustum()或更常用的是gluPerspective()
视口变换
决定场景映射的有效屏幕区域的形状。
调用glViewport(),参数表示窗口内部有效屏幕空间的原点和区域的大小(长宽高)。
注意,长宽高是用窗口的实际大小决定的,当窗口大小改变时,视口也应该改变。
声明:本文内容主要来自《OpenGL编程指南》。