Главная » Программирование игр под Android » Нормализованное пространство устройства и область просмотра OpenGL  – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

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

- где nor Х и nor Y – координаты 3D -точки нормализованных координат устройства, a viewportWidth и viewportHeight – размеры точки наблюдения в пикселах на осях х и у. Не стоит волноваться о нормализованных координатах устройства, поскольку OpenGL сам сделает все преобразования автоматически. О чем стоит переживать, так это о точке наблюдения и конусе отображения.

 

Матрицы

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

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

При умножении матрицы на точку мы применяем изменения к точке. Например, при умножении точки на матрицу, в которой закодирован переход на 10 единиц по оси х, точка передвинется на 10 единиц по оси х и, как следствие, изменит свои координаты.

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

Существует особая матрица, называемая единичной (identity matrix). Если мы умножим матрицу или точку на нее, ничего не произойдет. Считайте умножение точки или матрицы на единичную матрицу как умножение на единицу. Она не имеет никакого эффекта. Назначение единичной матрицы станет понятнее, когда мы узнаем, как OpenGL ES обрабатывает матрицы. Типичная проблема: что было раньше – яйцо или курица?

ПРИМЕЧАНИЕ

Когда мы говорим о точках, в данном контексте мы имеем в виду ЗР-векторы.

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

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

Матрица проекции. Название говорит само за себя – данная матрица кодирует проекцию и, как следствие, конус отображения нашей камеры.

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

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

По теме:

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