glLoadIdentity替换哪个矩阵?

时间:2014-10-14 20:50:13

标签: opengl graphics 3d jogl

public void render(GL2 gl) {
gl.glMatrixMode(GL2.GL_MODELVIEW); 
gl.glLoadIdentity();
glu.gluLookAt(2.0, 7.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
gl.glRotated(rotate, 0,0,1);
gl.glTranslated(-3, 0, -3);
glut.glutSolidCube(1);
}

我知道loadIdentity意味着用身份矩阵替换当前矩阵。但我不清楚。这是我的分析。我知道这一定是错的,但我无法弄清楚原因。

opengl是一个使用堆栈的状态机。所以上面的代码

首先绘制立方体

然后翻译(-3,0,-3)//矩阵T1

然后rotate()//矩阵R1

所以当前矩阵是T1R1

然后loadIdentity和当前矩阵将是identityMatrix。

我知道这绝对是错的。有人能解释一下吗?

1 个答案:

答案 0 :(得分:1)

想象一下这样的结构:

class GL2 {
 int currentMatrix;
 mat44 matrices;

 glMatrixMode(matIdx) {
  currentMatrix = matIdx;
 }

 glRotated(r, x, y, z) {
   matrices[currentMatrix] *= mat44.createRotationMatrix(r,x,y,z);
 } 

 glTranslated(x, y, z) {
   matrices[currentMatrix] *= mat44.createTranslationMatrix(x,y,z);
 }
}

这显然是假的但是它让你知道GL状态机acctualy存储当前矩阵somwhere的状态。它不是一个堆栈 - 我认为你可能会引用glPush和glPop进行堆栈操作。这不是这种情况。

所以在你的代码中:

  1. 使用modelview Matrix
  2. 将模型视图矩阵设置为标识
  3. 通过LookAt Matrix构造
  4. 乘以模型视图矩阵
  5. 将模型视图矩阵乘以旋转矩阵
  6. 将模型视图矩阵乘以Translatio Matrix
  7. 将Verticle提供给openGL - >将由当前的Matrix状态转换