我在之前的博客中曾提到过,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();

其对栈顶矩阵的操作过程如下图:

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

栈顶矩阵初始默认是一个单位矩阵,后使用函数glMultMatrixf载入与当前矩阵相乘的矩阵反而最先与坐标相乘。下面七张图是与上图七种栈顶状态相对应的茶壶位置,图中红,绿,蓝色箭头分别代表x,y,z轴

(1)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

(2)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

(3)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

(4)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

(5)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

(6)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

(7)

OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

 

相关文章:

  • 2021-04-24
  • 2022-02-21
  • 2021-11-11
  • 2021-12-21
  • 2021-06-16
  • 2021-05-17
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-24
相关资源
相似解决方案