OpenGL——矩阵堆栈的入栈出栈详解及金字塔案例

什么是矩阵堆栈

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

  • 堆栈的特点是先进后出,堆栈的默认深度是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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值