2013-04-07 6 views
0

Я использую OpenGL ES 2.0 на Android, и я, и я инициализирует свой дисплей следующим образом:Android Соотношение экрана

float ratio = (float) width/height; 
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); //Using Orthographic as developing 2d 

Что я имею понимание тревоги заключается в следующем:

Допустим, мое приложение это игра с фиксированным экраном (например, Pac-Man, т.е. без прокрутки, только вся игра, видимая на экране).

Теперь на данный момент, если я рисую четверной в -1 до +1 на обоих х и у меня получить что-то вроде этого:

enter image description here

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

Но я должен использовать это как свой «весь» экран? С довольно массивным почтовым ящиком слева и справа?

Я хочу прямоугольный дисплей, который представляет собой всю высоту физического дисплея (и как можно большую ширину), но это будет означать, что при меньшем, чем -1, и более чем +1, это проблема?

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

кину отдельный вопрос там относительно метода подрезки ;-)

Спасибо за любые предложения (примечание, я прочитал много вопросов относительно экрана independancy на Android, но я не могу показаться, чтобы получить ответ, который мне нужен от них).

Редактировать Как мне нравится работать с 0,0 в верхней части экрана, в основном то, что я делаю, это передать мой метод рисования что-то вроде этого:

quad1.drawQuad (10,0);

Когда метод drawQuad получает это, он в основном принимает диапазон слева направо, выражая мой openGL и разделяя ширину экрана (так, в моем случае от -1.7 до +1.7, поэтому 3.4/2560 = 0.001328125). И сказать, что я указать 10, как мой X (как указано выше), он будет говорить что-то вроде:

-1,7 + (10 * 0,001328125) = -1,68671875

Затем участки четверной в -1.68671875.

Выполнение этого Я могу работать с нормальными координатами (и я просто вычитаю, а не добавляю для оси y, чтобы я мог иметь 0 в верхней части).

Это хороший способ сделать что-то? И как этот эффект рисуется на экране с различным соотношением?

Потому что с помощью этого метода, при моменте, если я укажу 100 100 квадратных, это не квадрат, это прямоугольник. Однако, с положительной стороны, я могу заполнить весь физический экран, масштабируя квад по ширине x height.

ответ

0

Вы рисуете кварц 1x1, поэтому вы видите квадрат 1x1. Попробуйте перевести квадрат 0,25 вправо или влево, и вы увидите, что вы тоже можете рисовать в этом пространстве.

В графике вы создаете объект, например квад, в вашем случае вы сделали его 1x1. Затем вы размещаете его там, где хотите. Если вы не разместите его, то он будет в начале, и это то, что вы видите.

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

Кстати, с вашей орто-матричной функцией вы не просто указываете соотношение сторон экрана, но также указываете размер координатного блока, с которым вы должны работать. Вот почему 1x1 заполняет высоту экрана, потому что ваши верхние и нижние границы установлены на 1 и -1. Ваше соотношение немного больше, так как ваша ширина больше, чем ваша высота, поэтому ваши левые и правые границы, по сути, примерно равны -1,5 и 1,5 (независимо от вашего отношения).

Но вы также можете сделать что-то подобное;

Matrix.orthoM(mProjMatrix, 0, -width/2, width/2, -height/2, height/2, 3, 7);

Здесь, ваше отношение такое же, но вы отправляете его в орто-проекции с экранными координатами. (Отказ от ответственности: я не использую одну и ту же математическую библиотеку, которую вы делаете, но это, по-видимому, обычная орто-матричная функция, основанная на аргументах, которые вы передаете ей).

Так скажем, у вас есть разрешение 1000x500 пикселей. В OpenGL ваше начало 0,0 находится посередине. Итак, теперь ваш левый край находится на (-500, y), правый край на (500, y), а ваш верх (x, 250). Поэтому, если вы нарисуете свой квад размером 1x1, он будет очень крошечным, но если вы нарисуете квадрат 250x250, он будет выглядеть как ваш 1x1 квад в вашей предыдущей ортопроекции.

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

Но независимо от того, решите ли вы это сделать, надеюсь, вы поймете, что именно вы передаете этим матричным функциям.

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

+0

Спасибо @SebbyJohanns, я ввел исправление в конце моего первоначального вопроса, пожалуйста, не могли бы вы прокомментировать? Большое спасибо за помощь! – Zippy

+0

Я рекомендую, если вы нарисуете квадрат 100x100, вы получите квадрат без необходимости выполнять какие-либо промежуточные функции. Пока, пока вы учитесь, правильно настройте свои прогнозы, как он разработан. Когда вы начинаете ощущать, как работает этот материал, вы можете отвлечься от себя, но я лично не сделал бы этого так, как вы заявили в своем редактировании. Вы должны ознакомиться с системой координат OpenGL, где (0,0) является центром экрана. – johnbakers

+0

И если операционная система вашего устройства сообщает координаты иначе, чем OpenGL (как в случае с iOS), просто напишите простую функцию, которая сначала преобразует эти координаты в координаты OpenGL, но когда вы на самом деле выполняете рисование и т. Д., Вы должны передавать координаты OpenGL или вы открываете себя для ошибок и запутывания кода. – johnbakers