• 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)

  • 相关阅读:
    SpringBoot整合系列-整合H2
    SpringBoot整合系列-整合Swagger2
    BZOJ3626 [LNOI2014]LCA
    BZOJ4475 [Jsoi2015]子集选取
    BZOJ4466 [Jsoi2013]超立方体
    BZOJ3997 [TJOI2015]组合数学
    BZOJ3996 [TJOI2015]线性代数
    BZOJ2227 [Zjoi2011]看电影(movie)
    BZOJ2337 [HNOI2011]XOR和路径
    BZOJ2330 [SCOI2011]糖果
  • 原文地址:https://www.cnblogs.com/pursuiting/p/6240282.html
Copyright © 2020-2023  润新知