Android studio 使用glRotatef旋转.obj模型
我尝试使用glRotatef围绕自己的轴旋转.obj 3d模型。但它没有我所希望的那样工作 代码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
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做同样的事情呢
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);
}
使用此解决方案,我们不会在每个周期都加载标识。我们保持相同的矩阵
然后我们计算无穷小的旋转并将其应用于全局矩阵
因此,在模型的任何位置,我们都可以绕其局部x或y轴旋转
感谢datenwolf为我指明了正确的方向。Thx感谢您的返回!由于非交换矩阵的多重应用,我想我得到了运算顺序的问题。你写“并且每个变换都作用于“本地”原点。它适用于第一次旋转,但对于第二次旋转它似乎不起作用无论对象的方向如何,它都会围绕x屏幕轴旋转。我的意思是,经过几次随机旋转后,让我们想象模型处于某个位置。如果现在我要求纯旋转,模型将绕z轴旋转-不错-但如果我使用asf进行纯x旋转,模型将绕x屏幕轴旋转-不好-我一直在找。。