投影矩阵
模型视图矩阵实际上是 在视觉坐标中移动几何图形 。到目前为止,我们已经在屏幕或窗口上使用了范围为-1到+1(实际上沿z轴方向的范围也是-1到+1)的默认坐标系。
如果要使用不同的坐标系,方法是将我们想要的坐标系变换到这个单位立方体中。我们使用一个新的矩阵来完成这项工作,就是投影矩阵。
1 正投影
我们通常在2D绘图中使用正投影,并在我们的几何图形中将z坐标设为0.0。但是,z轴可以延伸到任何我们想要的长度。我们可以定义一个视景体,这个视景体将包括所有的几何图形。如果我们指定了视景体之外的几何图形,那么它就会被裁剪掉,也就是说,它将被沿着视景体的边界进行剪切。
在正投影中,所有在这个空间范围内的所有东西都会被显示在屏幕上,而不存在照相机或视点坐标系的概念。我们通过GLFrustum方法来完成上述工作。
GLFrustum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax);
1.1 示例程序
CANNOT INCLUDE FILE ./program/opengl/Src/Chapter04/OrthoGraphic/OrthoGraphic.cpp
1.2 输出
2 透视投影
GLFrustum类通过调用一个SetPerspective方法为我们构建一个平截头体。
GLFrustum::SetPerspective(float fFov, float fAspect, float fNear, float fFar);
其中的参数分别在垂直方向向上的视场角度,窗口的宽度与高度的纵横比,以及到近裁剪面和远裁剪面之间的距离。我们用宽度除以高度就能得到窗口或视口的纵横比。
2.1 示例程序
CANNOT INCLUDE FILE ./program/opengl/Src/Chapter04/Perspective/Perspective.cpp
2.2 输出
3 模型视图投影矩阵
下面给出一个综合例子。ModelviewProjection(模型视图投影矩阵)示例程序绘制了一个在屏幕中间旋转的线框花托。
3.1 示例程序
CANNOT INCLUDE FILE ./program/opengl/Src/Chapter04/ModelViewProjection/ModelViewProjection.cpp
3.2 输出
3.3 分析
- 使用CStopWatch类(GLTools库的一个组成部分)来基于经过的时间长短设置旋转速度。一开始将旋转速度设在了每秒60°。
- 再次强调,矩阵相乘操作的顺序非常重要!