如何围绕世界轴旋转对象?对象已被转换(旋转、平移),并且矩阵已被推送。我可以先加载一个矩阵,然后将opengl-stack中的顶部矩阵相乘吗?
我知道opengl操作的顺序是颠倒的,例如:
gl.glLoadIdentity(); // E
gl.glTranslatef(1, 0, 0); // M
gl.glRotatef(60, 0, 0, 1); // N
立方体将首先旋转然后平移。我知道这就是为什么:变换是 MNv,等于 M(Nv),它与“opengl 管道”的实现相匹配。
然后,我想让对象按世界 Z 轴(0,0,1)旋转 60 度,我可以在第一个变换语句之前添加这段代码:
gl.glLoadIdentity(); // E
gl.glRotatef(45, 0, 0, 1); // this is newly added
gl.glTranslatef(1, 0, 0); // M
gl.glRotatef(60, 0, 0, 1); // N
但是,对象经历了复杂的变换,所以我必须将变换矩阵保存在堆栈中:
gl.glLoadIdentity(); // E
gl.glTranslatef(1, 0, 0); // M
gl.glRotatef(60, 0, 0, 1); // N
....
gl.glPushMatrix();
然后我弹出这个矩阵,并乘以旋转矩阵(围绕世界坐标/轴旋转)。但是如果我先glPop,然后glRotate(或glMul),则顺序不正确。
我可以先加载旋转矩阵,然后乘以堆栈中的顶部矩阵吗?
不幸的是,我在 android 上编程,我在 GL10 中没有实现“glGetFolat”,所以我看不到复杂变换的结果矩阵。我尝试将GL10接口转换为GL11,它有方法“glGetFolat”,但它总是返回0。我在网上搜索,一些答案是我的设备的操作系统不支持GL11。
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// dither is enabled by default, we don't need it
gl.glDisable(GL10.GL_DITHER);
// clear screen in white
gl.glClearColor(1, 1, 1, 1);
// load a complex transform
gl.glLoadIdentity();
gl.glTranslatef(0, 0, -3.0f);
gl.glMultMatrixf(mComplexMatrix, 0);
gl.glPushMatrix();
}
public void onDrawFrame(GL10 gl) {
// clear screen
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// set-up modelview matrix
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
gl.glRotatef(mIncrement, 0, 0, 1); // of course it's wrong
gl.glPushMatrix();
// draw our object
gl.glPopMatrix();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
mCube.draw(gl);
gl.glPushMatrix();
}
谢谢