OpenGL ES视图:如何将其定位到景观?

时间:2009-12-20 20:15:08

标签: iphone ios opengl-es

寻找关于定位OpenGL ES应用程序的线索,我发现的大部分信息可以追溯到2008年,其中大部分都是指SDK的早期版本。显然,回到过去,在GL的情况下,建议不要旋转视图,而是将旋转应用为GL变换。目前的SDK仍然如此吗?简单地旋转窗口会简单得多:所有的触摸事件都会与旋转同步。

换句话说:如何在横向模式下设置OpenGL视图?

3 个答案:

答案 0 :(得分:7)

(我会用我找到的解决方案回答我自己的问题。虽然我会很乐意考虑其他答案。)

在CAEAGLLayer文档中,Apple声明(有点笨拙)你应该在GL内部进行旋转:“在纵向显示上绘制横向内容时,你应该自己旋转内容而不是使用CAEAGLLayer变换来旋转它“。他们没有解释原因,但我已经在多个地方读过有关性能明显下降的信息。

幸运的是,我只用了几行就解决了它。这适用于横向方向,主页按钮位于右侧

glPushMatrix();
  glRotatef(90, 0.0, 0.0, 1.0);
  glTranslatef(0.0f, -320.0f, 0.0f );

  // *** ALL RENDERING GOES HERE ***

glPopMatrix();

如果您的目标是iPad,请将-320替换为-768。

我还转换了来自UITouches的坐标:

int touchx = touch.y;
int touchy = viewWidth - touch.x;

答案 1 :(得分:5)

也许,它现在已经改变了。如果您查看最新的OpenGL ES编程指南,您可以找到以下句子:

“在iOS 4.2及更高版本中,渲染缓冲区的Core Animation旋转性能得到了显着提升,现在是在横向和纵向模式之间旋转内容的首选方式。为了获得最佳性能,请确保渲染缓冲区的高度和宽度均为32像素的倍数。“

就像这样:

[eaglLayer setAffineTransform:CGAffineTransformMakeRotation( -90 * M_PI  / 180)];

但是,CAEAGLLayer Class Reference提到“在纵向显示上绘制横向内容时,您应该自己旋转内容,而不是使用CAEAGLLayer变换来旋转它。”也许,文档还没有更新。上次更新时间是2008-05-19。

就像我一样参加过这个Q& A的FYI。

答案 2 :(得分:1)

你需要设置你的相机矩阵,在X轴上使用向上矢量而不是Y轴,这是你通常会做的。将世界旋转90度是有效的,但却使其他一切变得困难。

使用类似的东西:

up.x = 1; // instead of up.y
up.y = 0;
up.z = 0;
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, position.x, position.y, position.z, lookAt.x, lookAt.y, lookAt.z, up.x, up.y, up.z);