OpenGL矩阵堆栈处理

#为什么要使用矩阵堆栈? OpenGL在进行渲染的时候是通过模型视图矩阵和投影矩阵运算得到最终显示的坐标。

模型矩阵: 将顶点从局部坐标系转换到世界坐标系中; 视图矩阵: 将顶点从世界坐标转化到视图坐标系下; 投影矩阵: 将顶点从视图坐标系转换到规范立方体中(即屏幕中);

模型视图投影矩阵 = 投影矩阵 * 模型视图矩阵 (注意这里不能写成 模型视图矩阵 * 投影矩阵,矩阵乘法不满足交换

为了保证每一次渲染的独立性,需要在每一次渲染前保存当前状态(PushMatrix),并在渲染结束后恢复这个状态(PopMatrix)。

#使用方法

    
    //创建一个矩阵堆栈,初始化时会在创建时在栈顶加入一个单元矩阵 (FILO:先进后出)
    GLMatrixStack modelViewMatrix;
    
    //在栈顶载入一个单元矩阵
    modelViewMatrix.LoadIdentity();
    
    //在栈顶载入矩阵
    modelViewMatrix.LoadMatrix(<#const float *mMatrix#>)
    
    //将当期矩阵压入矩阵堆栈
    modelViewMatrix.PushMatrix(<#const float *mMatrix#>)
    modelViewMatrix.PushMatrix();   ps:复制当前栈顶的矩阵并保存在栈顶,这样pop后并不影响原来的矩阵堆栈
    modelViewMatrix.PushMatrix(<#GLFrame &frame#>)
    
    //出栈
    modelViewMatrix.PopMatrix();
    
    //获取矩阵栈顶的值
    modelViewMatrix.GetMatrix();
复制代码
ps:一个矩阵(A)乘以栈顶矩阵(B)的结果C将覆盖掉B,继续放在栈顶
复制代码

来看几个例子来理解一下:(3在栈顶) 假设当期矩阵堆栈modelViewMatrix为:

###PushMatrix(): 调用 modelViewMatrix.PushMatrix() 后变为:

比如这时候需要做一个矩阵运算,那么就会用复制的这个栈顶矩阵去做操作,开始矩阵运算,使用当前的栈顶矩阵进行运算:

结束后,调用pop,会把本次的结果3*A给pop出去,得到初始的矩阵:

###PushMatrix(<#const float *mMatrix#>) 继续,在原来的基础上执行 modelViewMatrix.PushMatrix(4),得到结果:

同理,结束后,会将 矩阵4 pop出栈,矩阵得到还原。

所以:push跟pop一定要成对出现,要不然可能会发生不可预知的错误

图画的不行,差不多能表达出意思,不要太在意。。。

转载于:https://juejin.im/post/5d22f350518825037a03176d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值