0

我正在使用 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 将我的对象滚动到它们的原点。但是我需要一种在 Z 轴上滚动整个视图的方法,因为它的起点是视图中心而不是单个对象。因此,如果对象位于中心的左侧,它将被看得更高。如果物体在右侧,它会显得更低。

4

2 回答 2

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, width]×[0, height] 的范围 (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();
于 2012-10-27T14:49:00.160 回答
0

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

于 2012-10-27T18:00:58.550 回答