复杂的变换后如何围绕世界坐标旋转

时间:2019-04-13 16:21:16

标签: opengl opengl-compat

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

谢谢

0 个答案:

没有答案