Android studio 使用glRotatef旋转.obj模型

Android studio 使用glRotatef旋转.obj模型,android-studio,opengl-es,rotateanimation,Android Studio,Opengl Es,Rotateanimation,我尝试使用glRotatef围绕自己的轴旋转.obj 3d模型。但它没有我所希望的那样工作 代码 public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glEnable(GL10.GL_LIGHTING); gl.glLoadIdentity(); gl.glTranslatef

我尝试使用glRotatef围绕自己的轴旋转.obj 3d模型。但它没有我所希望的那样工作

代码

public void onDrawFrame(GL10 gl) {

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glEnable(GL10.GL_LIGHTING);
        gl.glLoadIdentity();

        gl.glTranslatef(0f, -1.2f, -z);
        gl.glRotatef(xrot, 1f, 0f, 0f);
        gl.glRotatef(yrot, 0f, 1f, 0f);

        model.draw(gl);
    }
问题

第一次旋转yrot的效果非常好:无论模型的位置如何,它总是围绕自己的z旋转(好吧,我要求围绕y旋转,所以它并不完美。但至少它使用了自己的一个轴!)

现在,当我请求“xrot”时,它会绕着x屏幕轴旋转。不是它自己的x。有人知道为什么吗

备注

  • 我注意到onDrawFrame一直在运行。但是,该模型在y上并没有不断转换1.2f。仅当z!=0(我不知道为什么)
  • 我读到我们可以用三角学得到正确的x向量。但这对我来说毫无意义。如果这些应用程序能够在内存中保留模型的位置,以使正确的yrot,为什么它不能对xrot做同样的事情呢

操作顺序很重要。矩阵乘法链中的变换(每个OpenGL变换调用实际上只是一个矩阵乘法)的行为“相反”,即,首先应用最后一个乘以变换矩阵的变换。而每一次转换都作用于“局部”原点

第一个变换是围绕y轴旋转。然后应用x轴旋转,但这在新的局部坐标系中发生

现在,当我要求“xrot”时,它会绕x屏幕轴旋转。不是它自己的x。有人知道为什么吗

在特定的变换链中,x轴旋转恰好与屏幕的x轴对齐

我注意到onDrawFrame一直在运行。然而,该模型在y轴上并没有不断地平移1.2f

OpenGL不是一个场景图。它甚至不知道什么是模型。它只画单点、直线和三角形,一次画一个,就这样。如果场景中发生变化,则必须重新绘制所有内容。函数
glRotate
glTranslate
等不作用于模型。它们所做的只是操纵当前活动变换矩阵中的值。当你最终绘制一些东西时,它只是这个矩阵,用来变换传入的顶点向量(不仅仅是位置,还有固定函数中其他属性的矩阵,当使用着色器时,一切都是可能的)。无论如何,在开始绘制新框架时,您希望将矩阵重置为已知状态。这就是
glLoadIdentity
所做的。所以每一帧你都会重新开始

只有当z!=0(我不知道为什么)


在每次迭代中,
z
的值可能会集成到代码中其他地方的某个变量中。

这里有一个解决方案:

public void onDrawFrame(GL10 gl) {

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glEnable(GL10.GL_LIGHTING);

        if(flag==0) {
            gl.glLoadIdentity();
            gl.glTranslatef(0f, -1f, -z);
            flag=1; xrotold=0; yrotold=0;
        }
        else{
            float dxrot=xrot-xrotold;
            float dyrot=yrot-yrotold;

            gl.glRotatef(dxrot, 1f, 0f, 0f);
            gl.glRotatef(dyrot, 0f, 1f, 0f);

            yrotold=yrot;
            xrotold=xrot;
        }

        model.draw(gl);
    }
使用此解决方案,我们不会在每个周期都加载标识。我们保持相同的矩阵

然后我们计算无穷小的旋转并将其应用于全局矩阵

因此,在模型的任何位置,我们都可以绕其局部xy轴旋转


感谢datenwolf为我指明了正确的方向。

Thx感谢您的返回!由于非交换矩阵的多重应用,我想我得到了运算顺序的问题。你写“并且每个变换都作用于“本地”原点。它适用于第一次旋转,但对于第二次旋转它似乎不起作用无论对象的方向如何,它都会围绕x屏幕轴旋转。我的意思是,经过几次随机旋转后,让我们想象模型处于某个位置。如果现在我要求纯旋转,模型将绕z轴旋转-不错-但如果我使用asf进行纯x旋转,模型将绕x屏幕轴旋转-不好-我一直在找。。