OpenGL滚动游戏相机

时间:2012-10-27 14:28:46

标签: android iphone opengl-es

我正在使用OpenGL ES绘制我的图像,目前我的视图设置是:

    gl.glClearColor(0.6f, 0.6f, 1f, 1f);
    gl.glClearDepthf(1.0f);
    gl.glViewport(0, 0, varScreenWidth, varScreenHeight);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glLoadIdentity();
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glOrthof(0f, width, 0f, height, -10f, 10f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

我想在Z轴上滚动整个视图,但我不能使用glRotate()。因为我的物体从右向左移动,当我这样做时,我必须在它们的Y位置添加偏移量。我需要一种在Z轴上旋转整个视图的方法,如相机胶卷,这样物体就会自动在Y位置移动。我试图通过乘以(ScreenWidth - ObjPositionX)和sin(Zroll)来添加y偏移但是这有一些视觉问题,对象并没有完美地保持在它们的位置。谢谢你的帮助...

  • 修改

好的,有人希望我更清楚。所以函数glRotate将我的对象滚动到它们的orgin上。但是我需要一种方法来在Z轴上滚动整个视图,因为它的orgin是视图的中心而不是单个对象。因此,如果物体位于中心的左侧,则会看到更高的物体。如果物体位于右侧,则会看到较低的物体。

2 个答案:

答案 0 :(得分:0)

我认为这是在你的显示功能中(这是属于的!永远不要在窗口调整大小处理程序中设置投影和视口设置 - 它会咬你,非常糟糕!)

gl.glViewport(0, 0, width, height);

gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity(); // glOrtho needs a identity matrix to work upon
gl.glOrthof(0f, width, 0f, height, -10f, 10f);

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

您假设您的观看音量跨越[0,宽度]×[0,高度]的范围(x,y)。因此,要沿Z轴绕该体积的中心旋转,必须先在此处移动轴心点。转换按照与它们相乘的相反顺序应用到堆栈中,所以:

gl.glTranslatef(width/2., height/2., 0); // move back to origin
gl.glRotate(angle, 0, 0, 1); // rotate about Z
gl.glTranslatef(-width/2, -height/2., 0); // move pivot point to middle of viewing volume

draw_scene();

答案 1 :(得分:0)

我再次使用了glRotatef()函数。问题是:我正在使用glTranslate()将事物放在他们的位置。为此,我必须为每个对象调用glLoadIdentity。解决方案:现在我只在开始绘制对象之前使用glRotate()一次。把东西放在他们的位置:我意识到我可以在vertexBuffer本身添加X偏移量。我希望能帮助别人......