如何围绕世界轴旋转对象?对象已变形(旋转,平移),矩阵已被推入。 我可以先加载一个矩阵,然后在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();
}
谢谢