【openGL2021版】矩阵
大家好,我是Lampard猿奋~
欢迎来到船新的openGL基础系列的博客,今天记录的是矩阵
(一)移动旋转缩放
(1)glLoadIdentity单位矩阵
之前我们在每一帧绘画之前,都会执行一个glLoadIdentity()方法,这个方法是对矩阵进行一次重置,清空成单位矩阵。所以每一次绘制的时候,都能得到同样的画面
(百度百科对glLoadIdentity的解释)
如果不重置为单位矩阵的话,openGL就会在上一帧绘制的基础上进行一个线性运算,然后得出一个新的画面,执行出来的结果就会一闪一闪的
(2)glScalef缩放
我们可以用glScalef来进行缩放,实际上它影响的是我们坐标,对我们的坐标进行一个系数的相乘
缩放X轴为0.5倍
如果x,y,z轴缩放同一个数,那么画面不会改变,因为Z代表的是远近的程度
同时缩放0.5倍(没有变化)
(3)glRolatef旋转
我们可以通过glRolatef来进行一个旋转,其有4个参数(角度,X,Y,Z),它的旋转角度,是根据Z轴的正负决定,如果Z轴是正则四肢握拳,大拇指朝屏幕外,食指的方向就是旋转方向。若Z轴为负数,则大拇指朝里
正方向X轴旋转30度
(4)glTranslatef移动
glTranslatef能够帮助我们对图像进行移动,其作用原理和旋转相同
往右移动1个位置
(二)矩阵的压栈和出栈
(1)先移动再旋转,和先旋转再移动
这两个操作顺序不同其实得到的结果是不一样的,原因在于,无论是旋转还是移动它们的实现逻辑都是矩阵运算,它们发生的改变都是相对于“自己”。比如一个人,向前走100米再转身,和先转身再走100米得到的结果是不一样的
先移动再旋转
先旋转再移动
(2)glPushMatrix&glpopMatrix压栈和出栈
glPushMatrix()将当前矩阵压入栈中,当前矩阵不清零,其下的操作及显示在当前的矩阵的拷贝下继续进行,在使用glPopMatrix()后,当前的矩阵恢复到调用glPushMatrix()之前,在两者之间的各种变换不在起作用。
因此如果使用这个方法,我们就不需要每一帧开始的时候glLoadIdentity,因为每次矩阵的状态不会被污染(下图为GIF格式)
最后总结一下,就是显卡会有一个栈存储矩阵的状态,每一次会对栈顶矩阵进行绘制。我们可以通过glPushMatrix&glpopMatrix,来拷贝矩阵的状态,以至于原来的矩阵不被污染。今天就写那么多~