Главная » Программирование игр под Android » МАМА, СМОТРИ: Я НАРИСОВАЛ КРАСНЫЙ ТРЕУГОЛЬНИК.

0

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

Определение области просмотра

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

Координаты хиу задают верхний левый угол области просмотра в фреймбуфере, awidth и height задают размер области просмотра в пикселах. Обратите внимание, что OpenGL ES ставит начало координат фреймбуфера в левом нижнем углу экрана. Обычно мы присваиваем началу координат значение ноль, а параметры wi dth и hei ght делаем равными высоте и ширине экрана, поскольку работаем в полноэкранном режиме. Можно было бы указать OpenGL ES использовать при таком подходе только часть фреймбуфера. Тогда отображаемая графика была бы автоматически вписана в нужные размеры.

ПРИМЕЧАНИЕ

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

Определение матрицы проекции

Далее нам необходимо определить матрицу проекции. Поскольку  нас интересует только 20-графика, мы будем использовать параллельную проекцию. Как это сделать?

Режимы матрицы и активные матрицы

Мы уже знаем, что OpenGL ES отслеживает три матрицы: матрицу проекции, матрицу модели представления и матрицу текстуры (которую мы продолжаем игнорировать). OpenGL ES предлагает нам несколько особых методов для изменения этих матриц. Перед тем как мы сможем использовать матрицы, нам необходимо сообщить OpenGL ES, какой матрицей мы хотим управлять. Это делается с помощью следующего метода:

Параметр mode может быть выражен через GL10.GL PR0JECTI0N, GL10.GL MODELVIEW или GL10. GL TEXTURE. Наверное, и так понятно, какая из этих констант активизирует каждую матрицу. Все последующие вызовы методов управления матрицами будут направлены на матрицу, которую мы установили в этом методе, до тех пор, как снова не изменим активную матрицу, еще раз вызвав этот метод. Режим матрицы является одним из состояний OpenGL ES, которое также будет утеряно в случае потери контекста, (происходящей, если приложение было поставлено на паузу и возобновлено). Для управления матрицей проекции и всех последующих вызовов мы можем вызвать метод следующим образом:

Ортогональная проекция с применением glOrthof

OpenGL ES предлагает следующий метод для установки в активной матрице ортографической проекции:

Напоминает манипуляции, которые мы производили с плоскостями отсечения нашего конуса отображения. И действительно, сходство неслучайное. Какие же значения мы здесь определяем?

OpenGL ES имеет стандартную систему координат, как на рис. 7.5. Положительные точки по оси х находятся справа, положительные точки оси у – вверху, а положительные точки оси z направлены в нашу сторону. С помощью glOrthof  мы описываем конус отображения нашей параллельной проекции в данной системе координат. Если снова взглянуть на рис. 7.3, то мы увидим, что конус в параллельной проекции имеет форму куба. Мы можем рассматривать параметры для gl Orthof  как определяющие два угла нашего конуса-куба (рис. 7.5).

Рис. 7.5. Ортогональный конус отображения

Передняя сторона нашего конуса отображения непосредственно накладывается на область просмотра. В случае если мы работаем с полноэкранной областью просмотра, расположенной в диапазоне от (0; 0) до (480; 320) (например, альбомная ориентация на НТС Него), нижний левый угол передней стороны будет находиться в нижнем левом углу экрана, а правый верхний угол передней стороны – в верхнем левом углу экрана. OpenGL выполнит растяжение автоматически.

Поскольку нас интересует 2D -графика, мы определим угловые точки (левая; нижняя; ближайшая) и (правая; верхняя; дальняя) (см. рис. 7.5) таким образом, чтобы можно было работать в своеобразной пиксельной системе координат, как мы это делали с Canvas и мистером Номом. Вот как создать подобную систему координат:

Рис. 7.6. Параллельная проекция конуса отображения для визуализации 2D с помощью OpenGL ES

Наш конус отображения достаточно тонкий, однако это нормально, поскольку мы работаем в 2D. Видимая часть системы координат находится в диапазоне от (0; 0; 1) к (480; 320; -1). Любые точки, которые мы описываем внутри данной зоны, будут также видимы на экране. Эти точки будут проецироваться на переднюю часть куба, которая является ближней плоскостью отсечения. Затем проекция будет растянута до размера области просмотра независимо от ее размеров. Допустим, у нас есть Nexus One с разрешением 800 х 480 пикселов в альбомной ориентации. Когда мы описываем конус отображения так, как только что было показано, мы можем работать в системе координат 480 х 320, a OpenGL растянет изображение до фреймбуфера 800 х 480 (если мы решили, что область просмотра должна охватывать весь фреймбуфер). Кстати, ничто нам не мешает использовать и конусы отображения более странной формы. Например, мы могли бы взять конус, в котором углы имеют координаты (-1; -1; 100) и (2; 2; -100). Все, что попадает внутрь данной области, будет в итоге растянуто до необходимого размера и показано на экране. Достаточно удобно.

Обратите внимание, что мы также описываем ближнюю и дальнюю плоскости отсечения. Поскольку мы собираемся полностью игнорировать ось 2, возможно, захочется ввести 0 для обеих плоскостей. Однако этого не стоит делать по нескольким причинам. Чтобы не рисковать, мы предоставляем конусу отображения небольшой буфер в оси г. Все геометрические точки будут описаны на оси х, где z равна нулю, что, в принципе, и есть 2D.

ПРИМЕЧАНИЕ

Возможно, вы заметили, что ось у теперь направлена вверх, а ее начало находится в нижнем левом углу экрана. Несмотря на то что Canvas, фреймворк пользовательского интерфейса и много других API, визуализирующих 2D, используют систему, где ось у начинается в верхнем левом углу и идет вниз, для программирования игр гораздо удобнее применять данную новую систему координат. Например, если Марио прыгает, разве вы не ожидаете, что его у-координата будет возрастать вместо того, чтобы уменьшаться? Хотите работать в другой системе координат? Хорошо, просто поменяйте местами верхний и нижний параметры glOrthof. Также, хотя изображение конуса отображения выглядит правильно с геометрической точки зрения, передняя и дальняя плоскости отсечения выглядят для glOrthofO несколько по-другому. Поскольку это немного сложно, давайте просто притворимся, что предыдущие иллюстрации выглядят правильно.

Полезный фрагмент

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

Подождите, а что же делает здесь gl Loadldenti ty? Дело в том, что большинство методов, которые предлагает OpenGL ES для управления активной матрицей, на практике не задают матрицу. Вместо этого они создают временную матрицу с необходимыми параметрами и умножают ее на текущую матрицу. Метод glOrthof  – не исключение. Например, если бы мы в каждом кадре вызывали glOrthof , мы умножали бы матрицу проекции очень много раз. Так что вместо этого перед тем, как умножать матрицу проекции, мы лучше проверим, есть ли у нас в запасе чистая единичная матрица. Как вы помните, умножение единичной матрицы на другую матрицу не изменяет эту неединичную матрицу. Вот зачем нам понадобится gl Loadldenti ty С). Считайте, что мы сначала загружаем значение 1, а затем умножаем его на нужную матрицу (в нашем случае это матрица проекции, созданная glOrthofO).

Обратите внимание, что система координат теперь находится в диапазоне от (0; 0; 1) до (320; 480; -1) – это для визуализации в книжной ориентации.

Определение треугольников

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

OpenGL ES будет отсылать описания наших треугольников в виде массивов. Тем не менее, если учитывать, что OpenGL ES фактически является API на языке С, мы не можем использовать стандартные массивы Java. Вместо этого мы будем применять буферы Java NIO, которые являются обычными блоками памяти из последовательных байтов.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии