OpenGL ES 3d旋转会导致无意的翻译?

时间:2010-10-16 05:40:53

标签: iphone 3d opengl-es rotation

我正在开发一个iphone项目,我需要水平和垂直布局。我已经完美地在2D工作了,使用以下设置到我的投影矩阵:

 if(isHoriz()){
  glRotatef(90.0f,0.0f,0.0f,1.0f);
  SOrtho(0,  480, 0, 320, -1, 1); 
  }
  else
    SOrtho(0,  320, 0, 480, -1, 1); 

问题在于我转向3D

  glViewport(0,0,320,480);   
  glScissor(0,0,320,480); 
  gluPerspective(28.8f,320/480,0.1f,1000.0f);
  if(isHoriz())
    glRotatef(90.0f,0.0f,0.0f,1.0f);

这似乎有效,但视图垂直偏移错误。我想要发生的是垂直显示的上半部分成为水平显示的中心。相反,似乎垂直显示的中间成为水平显示的中心。

因为这是一部iphone,所以无论旋转如何,窗口高度(480)和宽度(320)都保持不变。我已经尝试在Windows程序中构建相同的代码,并且获得我想要的水平旋转效果的代码很简单。我只是更改窗口形状,以便我有一个横向窗口,然后删除对

的调用
  if(isHoriz())
    glRotatef(90.0f,0.0f,0.0f,1.0f);

(我也做类似2D代码的事情)。

我做错了吗?为什么Windows版本和iPhone版本看起来不一样?

编辑:为了澄清,我尝试在glRotatef调用的上方和下方添加glTranslatef()调用,但这似乎对我的相机的角度有影响。在上面的代码之后,摄像机代码立即应用于我的modelView矩阵。它看起来像这样:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(mRotate.mZ,0,0,1);
glRotatef(mRotate.mY,0,1,0);
glRotatef(mRotate.mX,1,0,0);
glTranslatef(-mPos.mX,-mPos.mY,-mPos.mZ);

相机的初始值为mRotate.mX = -80,mPos.Z = -8。

1 个答案:

答案 0 :(得分:0)

我仍然不确定为什么会发生这种情况,但是我将我的旋转从投影转移到了模型视图,一切正常。我认为这与Windows窗口具有不同形状(320x480或480x320)的事实有关,这种形状与iPhone形状不匹配(总是320x480)。