OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析
我在之前的博客中曾提到过,OpenGL中坐标是采用行向量表示的,与之相对应的是,在矩阵变换中使用的是变换矩阵的转置,并且使用的是后乘的方式。本文直接使用下面的代码来及其后的图示来解释函数
void glMultMatrixf( const GLfloat *m )
void glPushMatrix( void )
void glPushMatrix( void )
的含义。代码中函数rotate(float angle, float x, float y, float z)是让坐标点绕向量(x, y, z)旋转angle角度,旋转方向符合右手螺旋定则。函数rotate(45, 0, 1, 0),rotate(45, 0, 0, 1),rotate(45, 1, 0, 0)对应的矩阵分别为A,B,C的转置。
1 glMatrixMode(GL_MODELVIEW); 2 matrixView.identity(); 3 matrixView.rotate(45, 0, 1, 0); 4 matrixView.translate(0, 0, -cameraDistance); 5 6 glPushMatrix(); 7 glMultMatrixf(matrixView.get()); 8 9 matrixView.identity(); 10 matrixView.rotate(45, 0, 0, 1); 11 12 glPushMatrix(); 13 glMultMatrixf(matrixView.get()); 14 15 matrixView.identity(); 16 matrixView.rotate(45, 1, 0, 0); 17 18 glPushMatrix(); 19 glMultMatrixf(matrixView.get()); 20 21 glPopMatrix(); 22 glPopMatrix(); 23 glPopMatrix();
其对栈顶矩阵的操作过程如下图:
栈顶矩阵初始默认是一个单位矩阵,后使用函数glMultMatrixf载入与当前矩阵相乘的矩阵反而最先与坐标相乘。下面七张图是与上图七种栈顶状态相对应的茶壶位置,图中红,绿,蓝色箭头分别代表x,y,z轴
(1)
(2)
(3)
(4)
(5)
(6)
(7)