Библиографическое описание:

Бутенко В. В. Проекции в OpenGl ES [Текст] // Современные тенденции технических наук: материалы III междунар. науч. конф. (г. Казань, октябрь 2014 г.). — Казань: Бук, 2014. — С. 1-4.

Работа посвящена двум способам отображения графики в OpenGl ES: ортогональному методу и отображению объектов в перспективе.

Введение

Существует два типа проекций, которые обычно используются в 3D-графике.

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

-        Перспективная проекция. Предметы, более удаленные от нас, кажутся меньше.

В обоих случаях необходима плоскость проекции. Именно на эту плоскость падает свет, и образуется конечное изображение. Плоскость проекции на языке OpenGL ES называется ближней плоскостью отсечения. Все стророны отображения имеют похожие названия [3, с. 291].

Проекция зависит от того, как мы определим плоскости отсечения. В случае перспективной проекции левая, правая, верхняя и нижняя плоскости неперпендикулярны ближней и дальней плоскостям отсечения (Рис. 1).

Рис. 1. Перспективная проекция

В случае с параллельной проекцией эти плоскости перпендикулярны (Рис. 2), благодаря чему OpenGL ES отображает все предметы в одинаковом масштабе независимо от того, насколько предмет удален от камеры.

Рис. 2. Параллельная проекция

Нормализованное пространство устройства

OpenGL ES в первую очередь работает с треугольниками. Один треугольник имеет три точки в 3D-пространстве. Чтобы визуализировать такой треугольник в фреймбуфере, OpenGL ES необходимо знать координаты этих 3D-точек в пиксельной координатной системе фреймбуфера. Если ему известны три данные координаты точек, он может просто нарисовать в фреймбуфере все пикселы, которые находятся внутри треугольника.

Когда OpenGL ES уже известны проецируемые на ближнюю плоскость отсечения точки треугольника, можно перевести их в пиксельные координаты фреймбуфера. Для этого необходимо трансформировать точки в так называемое нормализированное пространство устройства. Основываясь на координатах нормализованного пространства устройства (Рис. 3), OpenGL ES подсчитывает конечные пиксельные координаты фреймбуфера [4, с. 53].

Рис. 3. Нормализованное пространство устройства

Настройка отображения

OpenGL ES выражает проекции в виде матриц. Матрица задаёт преобразования, которые следует применить к точке. При умножении матрицы на точку мы применяем изменения к точке. Например, при умножении точки на матрицу, в которой закодирован переход на 5 единиц по оси х, точка передвинется на 5 единиц по оси х и, как следствие, изменит свои координаты.

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

OpenGL ES содержит три вида матриц, применяемых к точкам моделей.

-        Модельно-видовая матрица применяется для изменения размеров и положения точек треугольника, ориентации камеры.

-        Матрица проекции задаёт преобразования для точек треугольника.

-        Матрица текстур применяется для управления координатами текстур.

OpenGL ES отслеживает эти три матрицы. Каждый раз, когда мы устанавливаем одну из них, она сохраняется в памяти до тех пор, пока мы снова ее не изменим.

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

Для перевода координат, проецируемых на ближнюю плоскость отсечения OpenGL ES использует область просмотра.

gl10.glViewport(0, 0, width, height);

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

Перед тем как мы начнём использовать матрицы, мы должны указать OpenGL ES какой матрицей будем управлять. Делаем это методом glMatrixMode. В качестве параметра передаем нужный тип матрицы.

gl10.glMatrixMode(GL10.GL_PROJECTION);

Все последующие вызовы методов управления матрицами будут направлены на матрицу, которую мы установили в этом методе, до тех пор, как снова не изменим активную матрицу, еще раз вызвав этот метод.

Перспективная проекция

Для установки в активной матрице перспективной проекции будем использовать метод glFrustumf.

gl10.glFrustumf(-ratio, ratio, -1, 1, 1, 25);

Задаём область видимости в форме усеченной пирамиды. Параметры задают левую, правую, нижнюю, верхнюю, ближнюю и дальнюю плоскости отсечения соответственно (Рис. 4).

public void onSurfaceChanged(GL10 gl10, int width, int height) {

                        gl10.glViewport(0, 0, width, height);

                        float ratio = (float) width/height;

                        gl10.glMatrixMode(GL10.GL_PROJECTION);

                        gl10.glLoadIdentity();

                        gl10.glFrustumf(-ratio, ratio, -1, 1, 1, 25);

            }

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

Рис. 4. Пример перспективной проекции

Параллельная проекция

Параллельная проекция устанавливается посредством метода glOrthof. Область видимости в этом случае будет иметь форму куба. Фактически метод glOrthof определяет два внешних угла области просмотра (Рис. 5).

            public void onSurfaceChanged(GL10 gl10, int width, int height) {

                        gl10.glViewport(0, 0, width, height);

                        gl10.glMatrixMode(GL10.GL_PROJECTION);

                        gl10.glLoadIdentity();

                        gl10.glOrthof(0, 480, 0, 320, 1, -1);

            }

Рисунок 5. Пример ортогональной проекции

Вывод

В заключении несколько слов о том, когда использовать параллельную проекцию, а когда перспективную. Перспективная проекция выполняется дольше параллельной. Её целесообразно использовать в 3D-играх и приложениях. Параллельная проекция больше подходит для визуализации 2D-графики.

Литература:

1.      Projection and camera view in OpenGL ES 1.0. [Электронный ресурс]. URL: http://developer.android.com/guide/topics/graphics/opengl.html

2.      GLSurfaceView.Renderer. [Электронный ресурс]. URL: http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html

3.      Zechner Mario. Beginning Android Games. — 2013. — 688 pages. — ISBN 978–1430230427

4.      Meht Prateek. Learn OpenGL ES for Mobile Game and Graphics Development. — 2013. — 209 pages. — ISBN 978–1430941341

5.      Munshi A, Ginsburg D, Shreiner. OpenGL ES 2.0 Programming Guide. — 2008. — 457 pages. — ISBN 978–0321502797

Обсуждение

Социальные комментарии Cackle