Мультиплатформенное решение OpenGLES с соотношением сторон экрана, использующее glOrthof - PullRequest
0 голосов
/ 16 марта 2012

Я пишу небольшой кроссплатформенный игровой движок для iOS, Android и BADA.У меня есть вопрос о настройке согласованности перспективы независимо от разрешения экрана и соотношения.

У меня есть следующие настройки для моей перевернутой нормализованной ортографической проекции, которая отлично работает:

 glViewport(0, 0, mWidth, mHeight);

 glMatrixMode(GL_PROJECTION);

glOrthof(-1.0,                  //LEFT
          1.0,                   //RIGHT
          -1.0 * mHeight / mWidth,  //BOTTOM
          1.0 * mHeight / mWidth,   //TOP
          -2.0,                  //NEAR
          100.0);                //FAR

На моем iPhone это нормально, и я получаю желаемое положение объектов мира, но на некоторыхУстройства Android и iPad добавляют свою позицию при сохранении правильного соотношения.

Все сетки имеют правильные пропорции, но положение, очевидно, меняется, так что если что-то выравнивается по нижней части экрана, то при рендеринге на iPad объекты будут отрисовываться частично за пределами экрана.

Итак, вопрос:

Это правильно, и мне нужно разместить объекты относительно ширины и высоты области просмотра?

Или

Существует ли способ настройки ортогональной перспективы таким образом, чтобы независимо от соотношения экрана положение оставалось постоянным, не нарушая перспективу объектов мира?

Я являюсьдумать о том, что я знаю, и о математике, которую я сделал второй, не вариант, потому что перспектива определяется на основе соотношения.

1 Ответ

2 голосов
/ 16 марта 2012

Экраны iPad и iPhone имеют разные пропорции. IPhone 3: 2, а iPad 4: 3. Телефоны Android имеют слишком широкий диапазон различных пропорций, чтобы перечислять их, и я бы не стал комментировать Bada. Поэтому, если вы не собираетесь показывать свое изображение в почтовом ящике или столбике или растягивать его так, чтобы соотношение сторон менялось от устройства к устройству, количество видимого внутреннего мира будет меняться между устройствами.

В тот момент, когда вы зафиксировали левый и правый параметры при расчете верха и низа на основе пропорций экрана. Таким образом, вы получите одинаковое количество вашего мира по экрану на каждом устройстве, но количество по вертикали изменится.

Если ваша игра включает в себя камеру, движущуюся в 3d, то вы действительно мало что можете с этим поделать. Но так как вы говорите о вещах, выровненных по сторонам экрана, я думаю, что камера перемещается в 2d?

Как правило, если камера движется по вертикали, то вы, вероятно, хотите сохранить то, что у вас есть. Ваши уровни уровней, которые в точности соответствуют ширине экрана, будут равны ширине экрана каждого. Более широкие устройства смогут видеть дальше впереди или сзади, но все готово.

Если камера движется по горизонтали, то вы, вероятно, захотите перейти к предоставлению фиксированных значений для верха и низа и вычислению влево и вправо в соответствии с соотношением сторон. Итак, я думаю, это будет:

glOrthof(-1.0 * mWidth / mHeight, //LEFT
          1.0 * mWidth / mHeight, //RIGHT
          -1.0 ,                  //BOTTOM
          1.0 ,                   //TOP
          -2.0,                   //NEAR
          100.0);                 //FAR

С точки зрения возможности закрыть все это внутри библиотеки, вам, вероятно, просто нужно получить флаг о том, должна ли быть фиксирована логическая ширина области просмотра, адаптирована ли высота к экрану или зафиксирована высота и адаптирована ли ширина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...