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。
我知道这绝对是错的。有人能解释一下吗?
答案 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进行堆栈操作。这不是这种情况。
所以在你的代码中: