![](https://img.haomeiwen.com/i16490557/28aea2868ac7b908.png)
视图变换
- 应用到场景中的第一种变换,用来确定场景中的有利位置,在默认情况下,透视投影中位于原点(0,0,0),并沿着 Z 轴负方向进行观察
- 试图变换将观察者放在你希望的任何位置,并允许在任何方向上观察场景,确定视图变换就像在场景中放置观察者并让它指向某一位置
- 通过
moveForward
调整观察者位置 -
从大局上考虑,在应用任何其他模型变换之前,必须先应用视图变换
,视图变换移动了当前工作的坐标系,后续的变化都会基于新坐标系进行
模型变换
用于操纵模型与其中某特定变换,通过旋转、缩放、平移将对象移动到指定位置
- 模型变换中,两个变换的顺序是
不能交换
的,交换后的矩阵相乘结果不一样
![](https://img.haomeiwen.com/i16490557/82886cd332088b48.png)
投影
- 正投影
void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)
- 透视投影
void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
矩阵堆栈
程序全局只有一个矩阵堆栈,但是需要绘制的图形有多种 即 变化有很多种--每个图形所需的变换矩阵不同,如果想两个图形的操作互不影响,需要一个矩阵状态去保存空白的状态
- 原始矩阵堆栈中,拷贝一份栈顶矩阵,压入栈顶
- 当有变换操作时,将变换操作的矩阵与矩阵堆栈栈顶相乘,将其结果覆盖栈顶矩阵
- 如果还有其他矩阵入栈,则继续相乘
- 当没有矩阵需要push,即图形绘制完成后,需要pop栈顶矩阵
![](https://img.haomeiwen.com/i16490557/c1196e0165e2e048.png)
仿射变换
矩阵堆栈中有与平移、旋转、缩放三个模型变换相对应的放射变换,可以不用通过模型变换,而是直接通过矩阵堆栈的API实现这3种变换,如下表所示![](https://img.haomeiwen.com/i16490557/cf02a867868b9ca7.png)
角色帧
主要是用来表示物体及观察者所处的位置,主要有三个参数
// vOrigin:当前所处的位置,默认是(0,0,0),处于原点
// vForward:即将要去的位置,默认是(0,0,-1),朝向-z轴方向
// vUp:朝向哪,默认是(0,1,0),朝向+y轴方向
class GLFrame
{
protected:
M3DVector3f vOrigin; // Where am I?
M3DVector3f vForward; // Where am I going?
M3DVector3f vUp; // Which way is up?
除了矩阵,GLFrame对象也可以直接压入矩阵堆栈,主要涉及以下3个方法
- 加载到堆栈栈顶
void GLMatrixStack::LoadMatrix(GLFrame &frame);
- 与堆栈栈顶相乘,将结果覆盖栈顶矩阵
void GLMatrixStack::MultMatrix(GLFrame &frame);
- 堆栈栈顶出栈
void GLMatrixStack::PushMatrix(GLFrame &frame);
网友评论