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一定要成对出现,要不然可能会发生不可预知的错误
图画的不行,差不多能表达出意思,不要太在意。。。
【OpenGL矩阵堆栈处理】转载于:https://juejin.im/post/5d22f350518825037a03176d
推荐阅读
- #矩阵中的鞍点
- 混淆矩阵画图
- 2.关于OpenGL|2.关于OpenGL 坐标系以及渲染流程
- Java积累|Java积累 - 堆和栈
- OpenGL|OpenGL ES之LUT(滤镜基准图)
- 【数组题】给定一个二进制矩阵|【数组题】给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
- OpenGL|OpenGL 绘制甜甜圈深度测试、多边形偏移、裁剪、 混合
- FFmpeg|FFmpeg 开发(07)(FFmpeg + OpenGLES 实现 3D 全景播放器)
- open基础笔记
- CapsNet|CapsNet 胶囊网络理解