1

如何围绕世界轴旋转对象?对象已被转换(旋转、平移),并且矩阵已被推送。我可以先加载一个矩阵,然后将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();
}

谢谢

4

0 回答 0