Главная » Программирование игр под Android » ВЕРШИНЫ В 3D – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

 

Вы узнали, что у вершины есть несколько атрибутов: позиция; цвет (необязательно); координаты текстуры (необязательно).

Мы создали вспомогательный класс Vertices, делающий за нас всю грязную работу. Тогда мы ограничили позиции вершины координатами по осям х и у. Все, что нужно для перехода в 3D, – модифицировать класс Vertices так, чтобы он поддерживал трехмерные позиции вершин.

Vertices3: сохраняем 3D -координаты

Напишем новый класс, называющийся Vertices3, чтобы работать с трехмерными координатами. Он будет основан на оригинальном классе Vertices. В листинге 10.1 показан его код.

Листинг 10.1. Класс Vertices3.java – координат стало больше.

Здесь практически ничего не изменилось по сравнению с классом Vertices, за исключением четырех небольших фрагментов. В конструкторе значение vertexSi ze теперь рассчитывается по-другому, поскольку позиция вершины имеет три координаты, а не две. В методе bind мы с помощью вызова метода gl VertexPoi nter  (первый аргумент) сообщаем OpenGL ES, что вершины имеют три координаты, а не две. Мы также увеличиваем смещение, значение которого устанавливается в вызове метода verti ces. posi ti on , для необязательных компонент, таких как цвет и координаты текстуры.

Это все, что нам нужно сделать. Использование класса Verti ces3 позволяет определять х-, у- и z-координаты каждой вершины при вызове метода Verti ces3, setVerti ces. Все остальное остается точно таким же. У нас могут быть заданы цвета для каждой вершины, а также координаты текстур, их индексы и т. д.

 

Пример

Напишем простой пример, который будет называться Vertices3Test. Мы хотим нарисовать два треугольника, у одного координата z каждой вершины будет равна -3, а у другого–5. Мы также определим цвет каждой вершины. Поскольку мы еще не обсуждали использование перспективной проекции, будем применять ортографическую проекцию с такими ближней и дальней плоскостями отсечения, что треугольники будут находиться в области видимости (например, ближняя равна 10, а дальняя–10). Сцена показана на рис. 10.1.

Рис. 10.1. Красный треугольник (спереди) и зеленый треугольник (сзади) в трехмерном пространстве

Красный треугольник располагается перед зеленым. Мы можем употребить слово перед, поскольку камера размещается в начале координат и в OpenGL ES по умолчанию направлена вдоль отрицательной части оси z (этой информации нет в справочной статье о камере). Зеленый треугольник также немного смещен вправо таким образом, чтобы мы могли видеть его фрагмент, когда камера смотрит на сцену спереди. Большая его часть должна перекрываться красным треугольником. В листинге 10.2 приведен код отрисовки этой сцены.

Листинг 10.2. Vertices3Test.Java: рисуем два треугольника

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

В классе Verti ces3Screen присутствует член Vertices3, который инициализируется в конструкторе. Всего есть шесть вершин, каждая из которых имеет цвет и не имеет текстурных координат. Поскольку ни один треугольник не имеет общих вершин с другим, мы не будем использовать индексированные геометрии. Эта информация передается конструктору Verti ces3. Далее устанавливаем координаты вершин с помощью вызова метода Verti ces3. setVertices. Первые три строки определяют красный треугольник, расположенный спереди, а последние три строки описывают зеленый треугольник, расположенный сзади и смещенный вправо на 0,5 единицы. Третий параметр в каждой строке – это координата соответствующей вершины по оси г.

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

Рис. 10.2. Два странных треугольника

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

OpenGL ES будет отрисовывать треугольники в том порядке, в котором они определены в экземпляре класса Verti ces3. Поскольку первым определен красный треугольник, он и будет нарисован первым. Чтобы это исправить, можно изменить порядок треугольников. Но что если камера будет располалагться, например, сзади? Нам снова придется сортировать треугольники перед их отрисовкой, поэтому такое решение не подходит. Это можно легко исправить. Для начала избавимся от орто-графической проекции и будем использовать перспективную.

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

По теме:

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