七、OpenGL中的基础变换和矩阵堆栈

2020-07-17  本文已影响0人  致青春_bf42

基础变换

OpenGL中设计的变换主要有以下几种:

变换 说明
视图变换 指定观察者位置
模型变换 在场景中移动物体
模型视图 描述视图/模型变换的二元性
投影 改变视景体大小 和 设置它的投影方式
视口 伪变化,对窗口上最终输出进行缩放

1.1 视图变换

1.2 模型变换

用于操纵模型与其中特定变换,也就是把物体通过平移、旋转、缩放的过程

截屏2020-07-17 下午4.51.35.png 截屏2020-07-17 下午4.51.42.png 截屏2020-07-17 下午4.55.18.png

模型变换中,两个变换的顺序是不能交换的,交换后的矩阵相乘结果是不一致的,如下图,交换平移和旋转的顺序,得到的结果完全不一致

2251862-4783ccd3e5041822.png

造成这种情况的根本原因,主要还是因为矩阵相乘采用的是矩阵的叉乘,而矩阵叉乘是不满足交换律的。

与3种模型变换相对应的OpenGL方法,如图所示,关于最后的综合变换需要作以下说明:

2251862-f6e029a08be4b118.png

1.3 投影

投影方式分为两种

矩阵堆栈

什么是矩阵堆栈?

OpenGL的矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域。一般说来,矩阵堆栈常用于构造具有继承性的模型,即由一些简单目标构成的复杂模型。矩阵堆栈对复杂模型运动过程中的多个变换操作之间的联系与独立十分有利。

为什么要用矩阵堆栈呢?

矩阵堆栈的使用

//类型
GLMatrixStack::GLMatrixStack(int iStackDepth = 64);

//在堆栈顶部载入一个单元矩阵
void GLMatrixStack::LoadIdentity(void);

//在堆栈顶部载⼊任何矩阵 //参数:4*4矩阵
void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);

//矩阵乘以矩阵堆栈顶部矩阵,相乘结果存储到堆栈的顶部
void GLMatrixStack::MultMatrix(const M3DMatrix44f);

//获取矩阵堆栈顶部的值 GetMatrix 函数 
//为了适应GLShaderMananger的使⽤用,或者获取顶部矩阵的副本
const M3DMatrix44f & GLMatrixStack::GetMatrix(void);
void GLMatrixStack::GetMatrix(M3DMatrix44f mMatrix);

压栈、出栈

//将当前矩阵压入堆栈(栈顶矩阵copy 一份到栈顶)
 void GLMatrixStack::PushMatrix(void);

//将M3DMatrix44f 矩阵对象压入当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix);

//将GLFame 对象压入矩阵对象
void PushMatrix(GLFame &frame);

//出栈(出栈指的是移除顶部的矩阵对象)
void GLMatrixStack::PopMatrix(void);

矩阵堆栈中关于入栈、相乘、出栈的流程

需要注意:
==> 用了几个push,就需要pop几个矩阵,push与pop是一一对相应的
==> 最终的矩阵堆栈仍然是最初时的矩阵堆栈

2251862-7474d25c88fac263.png

仿射变换

矩阵堆栈中有与平移、旋转、缩放三个模型变换相对应的放射变换,可以不用通过模型变换,而是直接通过矩阵堆栈的API实现这3种变换,如下表所示

2251862-1b2bd73de257aae7.png

相对于仿射变换与模型变换,我们更倾向于使用模型,这种方式用的很少

上一篇下一篇

猜你喜欢

热点阅读