OpenGL

OpenGL矩阵堆栈处理

2019-05-19  本文已影响2人  聪莞

为什么要使用矩阵堆栈?

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为:

image.png

PushMatrix():

调用 modelViewMatrix.PushMatrix() 后变为:

image.png

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


image.png

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


image.png

PushMatrix(<#const float *mMatrix#>)

继续,在原来的基础上执行 modelViewMatrix.PushMatrix(4),得到结果:

image.png

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

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

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

上一篇下一篇

猜你喜欢

热点阅读