OpenGL 矩阵操作

523 阅读2分钟

一. 向量与矩阵

  • 矩阵 Matrix 数学上,一个 m * n 的矩阵是一个由 m 行(row)n列(column)元素排列成的矩形阵列。矩阵里的元素可以是数字、符号或数学式。 一个从左上角到右下角的连线上的元素都为 1 的方阵(行和列大小一样)称之为单位矩阵。 大小相同(行数列数都相同)的矩阵之间可以相互加减,具体是对每个位置上的元素做加减法。矩阵的乘法则较为复杂。

矩阵示意图

  • 向量 Vector 在计算机几何当中我们可以把向量理解为一个 m * 1 的矩阵。m 为任意正整数。

二. 压栈/出栈

2.1 矩阵堆栈的使用

在 OpenGL 里面矩阵堆栈的类型为 GLMatrixStack, 这个堆栈里面最多存储 64 的矩阵,也就是说他的深度 stackDepth = 64GLMatrixStack 在创建的时候默认会给里面添加一个 4x4 的单元矩阵。初始化过后 GLMatrixStack 里面的元素个数为 1

  • 在堆栈顶部载入一个单元矩阵 GLMatrixStack::LoadIdentity(void)
  • 在堆栈顶部载入一个任意矩阵 GLMatrixStack::LoadMatrix(const M3DMatrix44f m)
  • 矩阵乘以矩阵堆栈顶部的矩阵,相乘的结果存储到堆栈的顶部,这时候会覆盖原来矩阵的值 GLMatrixStack::multMatrix(M3DMatrix44f m)
  • 获取矩阵堆栈顶部的值 GLMatrixStack::GetMatrix(M3DMatrix44f mMatrix)
2.2 压栈
  • 将当前矩阵压入堆栈(把原栈顶矩阵 copy 一份存在栈顶 GLMatrixStack::PushMatrix(void) 比如原来的对面里面有 [m1, m2, m3] 总共 3 个矩阵,调用PushMatrix() 以后就会变为 [m1, m2, m3, m3]

  • M3DMatrix44f 矩阵对象压入当前矩阵堆栈,存在栈顶位置。GLMatrixStack::PushMatrix(const M3DMatrix44f mMatrix) 比如原来的对面里面有 [m1, m2, m3] 总共 3 个矩阵,调用PushMatrix(m4) 以后就会变为 [m1, m2, m3, m4]

  • GLFrame 对象压入矩阵堆栈 PushMatrix(GLFrame &frame),这个方法会在内部调用 PushMatrix(const M3DMatrix44f mMatrix)

2.3 出栈

移除栈顶的矩阵对象,无需传参 GLMatrixStack::PopMatrix(void)

矩阵堆栈操作图