OPENGL之矩阵
前面的若干重要概念中描述了OPENGL中的几个重要变换,而矩阵是线性代数中的重要数学工具,它被用来对这些变换进行数学上的实现。
矩阵主要有以下几种:
模型视图矩阵:模型视图矩阵是个4*4的矩阵,代表经过变换的坐标系统,我们可以用这个坐标系统放置物体并设置其方向,顶点坐标以单列矩阵的形式表示,乘以模型视图矩阵,产生与视觉坐标系统相对应的经过变换的新坐标(顶点坐标*模型视图矩阵=与视觉坐标系统对应的新坐标)
对模型视图矩阵进行修改
以下是对模型视图矩阵进行修改的例子:
移动:
glTranslatef(GLfloat x,Glfloat y,GLfloat z);
例如: 若我们想将绘制对象沿着y轴向上移动10个单位,
glTranslatef(0.0f,10.0f,0.0f)
旋转
glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)
解释:将绘制对象沿着向量(x,y,z)旋转angle度(旋转轴:(x,y,z),旋转角度(angle))
缩放
glScalef(GLfloat x,GLfloat y,GLfloat z);
以上是对模型视图矩阵的修改,但是我们应该注意到,这种对矩阵的修改是累加性的,即第二次的修改是在第一次修改的基础上进行的,每一次的修改并非独立的,
,为了是每一次的修改独立,符合渲染流水线的工业思想,于是就有了单位矩阵
单位矩阵
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
单位矩阵数学上的定义是:对角线为1,其他部位全为0,在OPENGL中的定义是:把模型视图矩阵重置回原点
矩阵堆栈:
glPushMatrix()
保存当前模型视图矩阵变换状态
glPopMatrix()
恢复栈顶元素保存的模型视图矩阵变换状态
glGet(GL_MAX_MODELVIE_STACK_DEPTH) 或者 glGet(GL_MAX_PROJECTION_STACK_DEPTH)
以上两个函数分别用来获得模型视图矩阵堆栈的深度和投影和投影矩阵堆栈的深度
矩阵堆栈的深度:能保存的最多矩阵数
如果超过了堆栈深度:产生GL_STACK_OVERFLOW错误(上溢)
如果试图从一个空堆栈中弹出一个矩阵值:产生GL_STACK_UNDERFLOW错误(下溢)
亲爱的听众朋友我是你的代班DJ