什么是矩阵堆栈
矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域。
一般说来,矩阵堆栈常用于构造具有继承性的模型,即由一些简单目标构成的复杂模型。矩阵堆栈对复杂模型运动过程中的多个变换操作之间的联系与独立十分有利。
- 堆栈的特点是先进后出,堆栈的默认深度是64
- 矩形堆栈都有默认值,且默认值是单元矩阵。
初始化一个矩阵堆栈
矩阵堆栈中默认会有一个单元矩阵,但是你也可以初始化一个单元矩阵。
//初始化一个单元矩阵
modelViewMatrix.LoadIdentity();
压栈 PushMatrix()
压栈是为了存储一个状态,为了不影响其他状态,所以进行压栈。
//modelViewMatrix在初始化时,初始化了一个单元矩阵,此时的压栈就是将栈顶的矩阵复制一个,然后压入栈顶
modelViewMatrix.PushMatrix()
相乘 MultMatrix(viod)
矩阵乘以矩阵堆栈顶部矩阵,相乘结果存储到堆栈的顶部。
//我们使用栈顶的单元矩阵与观察者矩阵相乘,此时得到的结果是观察者矩阵,并存放到栈顶。
modelViewMatrix.MultMatrix(mCamera)
//然后再使用刚刚得到的观察者矩阵与物体矩阵相乘,得到结果存放到栈顶。
modelViewMatrix.MultMatrix(mObjectFrame)
此时就完成了观察者矩阵与物体矩阵的相乘
出栈PopMatrix();
出栈是为了恢复一个状态,当结束例如旋转、缩放等状态时,就需要出栈恢复之前的状态,所以需要出栈并且是出栈顶位置的状态。
//出栈
modelViewMatrix.PopMatrix()
获取矩阵栈顶的值GetMatrix()
modelViewMatrix.GetMatrix()
上述过程可以使用一张流程图来展示:
注:图片来自凡几多的简书–https://www.jianshu.com/p/ce3b51b8f168
重点:上代码
常量
GLMatrixStack modelViewMatrix;// 模型视图矩阵堆栈
GLMatrixStack projectionMatrix;// 投影视图矩阵堆栈
GLFrame cameraFrame;// 观察者坐标系=> 观察者矩阵
GLFrame objectFrame;// 物体坐标系 => 物体矩阵
GLBatch triangleBatch;// 简单的批次容器,是GLTools的
GLFrustum viewFrustum;// 投影方式,学名:视景体。用来构造投影矩阵。
main 函数:程序入口中的设置
int main(int argc,char *argv[]) {
//设置当前工作目录,针对MAC OS X
/*
`GLTools`函数`glSetWorkingDrectory`用来设置当前工作目录。实际上在Windows中是不必要的,因为工作目录默认就是与程序可执行执行程序相同的目录。但是在Mac OS X中,这个程序将当前工作文件夹改为应用程序捆绑包中的`/Resource`文件夹。`GLUT`的优先设定自动进行了这个中设置,但是这样中方法更加安全。
*/
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库,这个函数只是传输命令参数并且初始化glut库
glutInit(&argc, argv);
/*
初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指
双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区
--GLUT_DOUBLE`:双缓存窗口,是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式,经常用来生成动画效果;
--GLUT_DEPTH`:标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试;
--GLUT_STENCIL`:确保我们也会有一个可用的模板缓存区。
深度、模板测试后面会细致讲到
*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|