Как мне сохранить физические размеры между разными iThings в Open GL? - PullRequest
0 голосов
/ 27 марта 2012

Недавно я проснулся, осознав, что у нас, разработчиков iOS, теперь есть небольшой парк экранов разных размеров / разрешений.Эта таблица иллюстрирует характеристики экрана развернутых в настоящее время устройств iOS:

http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density

Очень удобно.Теперь вот загадка:

Я строю простое представление Open GL на своем iPad2.Мой код создает видовой экран OpenGL с обычными пиксельными размерами iPhone / Pad (320x480, 768x1024).Я рисую белый прямоугольник в эту вещь.Я делаю его шириной 200 пикселей.Мило.Хороший старый iPad.

Я компилирую тот же код (который автоматически определяет размеры экрана) в мой iPhone4.Мой белый прямоугольник не такой ширины, как на планшете.Справедливо.Я знаю, что фактические размеры в пикселях iPhone4 составляют 640x960, а в iPad - 768x1024 с учетом ppi каждого устройства.

Разделение 768/640 Я получаю хороший коэффициент масштабирования 1.2, который язатем умножьте на 200 ширину моего тестового прямоугольника и перекомпилируйте для iPhone4 ... Arrrgh ... это почти работает.Прямоугольник на несколько пикселей меньше ширины, чем его iPad.

Кто-нибудь может указать на ошибку в моих рассуждениях?Я хочу иметь возможность пометить отображаемый объект как «независимый от экрана», чтобы сохранить его физические размеры между iThings.Напиши один раз, беги куда угодно.Да, верно.

Я создаю игру, и, конечно, у этого чертовски замечательного iPad3 появилось новое разрешение.Я пытаюсь абстрагировать как можно больше возможных ошибок в разрешении.У меня, вероятно, не будет возможности протестировать свое приложение на iPad3 перед выпуском.Кто-нибудь еще в этой лодке?

1 Ответ

0 голосов
/ 27 марта 2012

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

OpenGL при рисовании моего тестового прямоугольника не заботится о разрешении в пикселях.Он заботится только о системе координат, которой вы его кормите.Как и многие из вас, без сомнения, я использую удобные размеры 320x480 / 768x1024 для систем координат в OpenGL для Phone / Pad.

Чего мне не хватало, так это того, что 200 единиц «OpenGL-land» в системе iPhone [320/480] отличаются от 200 единиц в системе iPad [768/1024] не из-за различий в разрешении экрана, но потому что отношение 320/760 (или эквивалентно, 480/1024) отличается от соотношений ширины экрана или высоты экрана телефона / планшета.Я выбрал линейку и измерил размеры для себя, потому что я не мог найти авторитетные, достоверные цифры в Интернете.

Ширина экрана iPhone: 5,05 см Ширина экрана iPad: 14,8 см

Выможно легко увидеть, что 5.05 / 14.8 отличается от 320 / 768.

В любом случае, «истинное» отношение см к единицам OpenGL на iPhone составляет 5.05 / 320, а для iPad - 14.8 / 768..

Коэффициент масштабирования между ними равен x:

14,8 / 768 = x (5,05 / 320)

0,01927083333333 = x * 0,01578125

=1.221 (ближайшая тысячная)

Итак, я вернулся к своему коду iPhone, и теперь я измерил свой тестовый прямоугольник шириной 1.221 * 200 и оставил свой тестовый прямоугольник до 200 в своем коде iPad.Перекомпилировал оба. В этот раз мой белый тестовый прямоугольник имеет одинаковую ширину как на iPad2, так и на iPhone4.

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

Millenium Falcon, Alex

...