OpenGL ES view: как ориентировать его в ландшафт? - PullRequest
3 голосов
/ 20 декабря 2009

В поисках подсказок об ориентации приложения OpenGL ES в альбомной среде большая часть информации, которую я нашел, датируется 2008 годом, большая часть которой относится к ранним версиям SDK. Очевидно, в те времена, в случае GL, было рекомендовано не поворачивать вид, а вместо этого применять поворот как преобразование GL. Это все еще так с текущими SDK? Было бы намного проще просто повернуть окно: все события касания были бы синхронизированы с вращением.

Другими словами: как настроить представление OpenGL в ландшафтном режиме?

Ответы [ 3 ]

7 голосов
/ 21 декабря 2009

(Я отвечу на свой вопрос с помощью решения, которое нашел. Хотя я буду рад рассмотреть и другие ответы.)

В документах CAEAGLLayer Apple заявляет (немного неуклюже), что вы должны выполнять вращение внутри самой GL: «При рисовании ландшафтного содержимого на книжной ориентации вы должны вращать содержимое самостоятельно, а не использовать преобразование CAEAGLLayer для его поворота. «. Они не объясняют почему, но я много раз читал о заметном падении производительности.

К счастью, я решил это с добавлением всего нескольких строк. Это для альбомной ориентации вправо, где кнопка home находится на вправо .

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;
5 голосов
/ 29 октября 2012

Может быть, теперь это изменилось. Если вы посмотрите последнее руководство по программированию на OpenGL ES, вы можете найти следующее предложение:

"В iOS 4.2 и более поздних версиях скорость рендеринга буферов рендеринга Core Animation была значительно улучшена, и теперь они являются предпочтительным способом вращения контента между альбомным и портретным режимами. Для лучшей производительности убедитесь, что высота и ширина рендеринга в буфере соответствуют кратный 32 пикселям. "

Как так:

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

Но в справочнике по классу CAEAGLLayer упоминается «При рисовании ландшафтного содержимого на книжной ориентации вы должны вращать содержимое самостоятельно, а не использовать преобразование CAEAGLLayer для его поворота». Возможно, документация еще не обновлена. Время последнего обновления: 2008-05-19.

Только к вашему сведению, кто посещал эти вопросы и ответы, как я.

1 голос
/ 05 марта 2012

Вам необходимо настроить матрицу камеры с вектором вверх по оси 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...