ТЕХНОЛОГИЯ СОЗДАНИЯ ТРЕХМЕРНЫХ ПРИЛОЖЕНИЙ РЕАЛЬНОГО ВРЕМЕНИ ДЛЯ ОС ANDROID - Студенческий научный форум

IV Международная студенческая научная конференция Студенческий научный форум - 2012

ТЕХНОЛОГИЯ СОЗДАНИЯ ТРЕХМЕРНЫХ ПРИЛОЖЕНИЙ РЕАЛЬНОГО ВРЕМЕНИ ДЛЯ ОС ANDROID

 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Создание трехмерных приложений для ОС Android особо актуально с тех пор, как устройства, использующие эту платформу, стали самими распространенными в мире, опередив ближайшего конкурента - Apple iOS.

Устройства с ОС Android принадлежат классам устройств, отличающимся по производительности и назначению, - от mp3-плееров и наручных часов до планшетных компьютеров. Эти устройства решают задачи из самых разных предметных областей, для большинства которых желательно использование качественной трехмерной визуализации реального времени.

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

  • - исследовать особенностей разработки трехмерных приложений в ОС Android,
  • - обосновать использование объектно-ориентированной парадигмы для достижения цели,
  • - выполнить проектирование и реализацию иерархии классов для создания трехмерных приложений.

В качестве программно-аппаратного интерфейса была выбрана библиотека OpenGL ES. Именно она рекомендована разработчиками Android при создании высокопроизводительных приложений [3]. Кроме того, OpenGL ES позволяет достичь наиболее качественного результата.

На данный момент большинство мобильных устройств работают под управлением Android версии 2.0 или старше. В этих устройствах поддерживается одновременно OpenGL версии ES 1.0 и 2.0. В отличие от настольного ПК при разработке трехмерных приложений для Android встает вопрос выбора версии OpenGL. Каждая последующая версия OpenGL для ПК содержит в себе всю функциональность предыдущих версий. В тоже время старшая и младшая версии OpenGL ES содержат принципиально разную функциональность. Следовательно, они решают одинаковые задачи качественно разными способами. Например, часть функциональности ES 2.0 программист должен создавать самостоятельно при помощи специальных программ - шейдеров. Нельзя признать старшую версию однозначно лучше младшей. Необходимо выбрать версию, позволяющую наилучшим образом достигнуть цели работы. Этот выбор непосредственно повлияет на структуру разрабатываемого приложения.

В ходе сравнения версий OpenGL ES были проанализированы различия в их синтаксисе [1,2] и функциональности. Результаты представлены в табл. 1.

Таблица 1. Результат сравнения версий OpenGL ES

Критерий

OpenGL ES 1.0

OpenGL ES 2.0

Объем кода

Меньше

Больше

Структура программы

Проще

Сложнее

Итоговый результат

Хуже

Лучше

Число поддерживаемых эффектов

Меньше

Больше

Производительность

Ниже

Выше

Настройка рендеринга

При помощи параметров сборки примитивов, растеризации, текстурирования, освещения и т.п.

При помощи шейдеров и параметров сборки примитивов

OpenGL ES 1.0 подходит для решения задач, в которых важнее скорость разработки, чем качество изображения. Целям данной работы наилучшим образом соответствует версия 2.0, так как нас интересует, прежде всего, производительность и качество результата. Однако, при использовании этой версии, с ростом числа геометрических объектов значительно увеличивается размер программы.

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

Для выявления особенностей ES 2.0 была написана тестовая программа, состоящая из нескольких геометрических объектов, шейдерных объектов и атрибутов вершин. Особенности организации этой программы позволили выделить характерные повторяющиеся части кода и данные со сходным поведением. При помощи указанных структурных особенностей были созданы классы отмеченные, синим цветом на рис. 1.

Разработанная объектная модель получила название «LitEngine». Диаграмма классов приведена на рис. 1.

Диаграмма содержит следующие объекты:

1. Создание геометрических объектов:

  1.  
    1. Контейнеры данных - абстрактный класс LitDataContainer и его наследники. Предназначен для хранения атрибутов любой размерности и назначения.
    2. Фабрика данных - абстрактный класс LitDataFactory и его наследники. Предназначена для заполнения контейнеров данных атрибутами, описывающими один геометрический объект.Матрица преобразования - класс ModelViewMatrix. Предназначена для хранения матрицы и работы с ней в терминах преобразования координат.
    3. Универсальный объект - класс Universal3DObject. Предназначен для хранения в одном контейнере всей информации, описывающей один геометрический объект.

2. Настройка света:

  1.  
    1. Материал - абстрактный класс LitAppearance и его потомки. Предназначен для хранения настроек для конкретной шейдерной программы.
    2. Менеджер эффекта - LitSpecialEffect и его потомки. Предназначен для передачи информации из объекта «материал» в объект «шейдерная программу».

3. Установка камеры:

  1.  
    1. Матрица проекции - класс ProjectionMatrix. Предназначена для хранения матрицы и работы с ней в терминах проектирования координат.
    2. Камера - класс LitCamera. Предназначена для работы с матрицей проекции в терминах настройки камеры.

4. Рендеринг:

  1.  
    1. Шейдерная програмама - класс glslProgramm. Предназначен для инкапсулирования всей работы с одним шейдером: загрузкой,  компиляцией, линковкой, настройкой, активацией.

В листингах 1-3 поэтапно приведены примеры использования классов LitEngine для создания демонстрационного приложения, выводящего несколько разноцветных вращающихся торов.

Листинг 1. Однократная инициализация

// настраиваем среду OpenGL ES 2.0

GLES20.glClearColor(0.07f, 0.07f, 0.1f, 1.0f);

GLES20.glEnable(GLES20.GL_DEPTH_TEST);

// Создаем объект камеры

LitCamera camera = new LitCamera();

// Создаем и инициализируем объект эффекта

simplestEffect = new SimplestEffect(context);

simplestEffect.Init();

// Создаем фабрику данных для тора с опрделенными настройками качества (~1800 вершин)

TorusDataFactory torusFactory =

new TorusDataFactory(2,30,0.7f,30);

// Создаем и инициализируем материалы для эффекта simplestEffect

Appearance4SimplestEffect[] colors =

new Appearance4SimplestEffect[7];

for (int i = 0; i < colors.length; i++)

colors[i] = new Appearance4SimplestEffect();

// Заполняем поле «цвет» у каждого материала

colors[0].setColor(0, 0, 1, 1);

colors[1].setColor(0, 1, 0, 1);

colors[2].setColor(0, 1, 1, 1);

colors[3].setColor(1, 0, 0, 1);

colors[4].setColor(1, 0, 1, 1);

colors[5].setColor(1, 1, 0, 1);

//Создаем несколько универсальных объектов

Universal3DObject[] torus = new Universal3DObject[6];

//Задаем каждому объекту все его атрибуты, эффект и материал

for (int i = 0; i < torus.length; i++)

{

torus[i] = new Universal3DObject();

torusFactory.Tune(torus[i]);

torus[i].effect = simplestEffect;

torus[i].material = colors[i];

}

Листинг 2. Настройка камеры

// настраиваем среду OpenGL ES 2.0

// height и width - параметры функции настройки камеры

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

float ratio = (float) width / height;

// настраиваем камере перспективную проекцию

camera.Frustum(-ratio * 5, ratio * 5, -5, 5, 3, 15);

// настраиваем камере точку взгляда и положение в пространстве

camera.LookAt(0, 0, -7, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

Листинг 3. Рендеринг и анимация

//Обнуляем буферы данных OpenGL

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT

|GLES20.GL_DEPTH_BUFFER_BIT);

//вычислим угол поворота на основе системного времени

long time = SystemClock.uptimeMillis();

float realangle = (float) (time * 0.1);

//вычислим параметры смещения и поворота и передадим их объектам

float step = (float) (Math.PI*2.0/triangles.length);

for (int i = 0; i < triangles.length; i++)

{

float a = step*i+realangle/100f;

float x = (float) (Math.sin(a)*4);

float y = (float) (Math.cos(a)*4);

triangles[i].Move(x, y, 0f);

a = i*60+realangle/2f;

triangles[i].Rotate(a, 0.0f, 1.0f, 0.0f);

}

// Вызовем у каждого тора рендеринг

for (int i = 0; i < triangles.length; i++)

triangles[i].Render(camera);

На рис. 2 приведен снимок устройства, на котором выполняется код с листингов 1-3.

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

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

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

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

  • 1. Leech J. OpenGL ES Common Profile Difference Annotated Specification 2.0.25. [Электронный ресурс]. Систем. требования: Foxit Reader. - URL: http://www.khronos.org/registry/gles/specs/2.0/es_cm_spec_2.0.25.pdf (дата обращения: 25.01.2012).
  • 2. Munshi A. OpenGL ES 2.0 Programming Guide. Boston: Addison-Wesley, 2009. 457 с.
  • 3. Android DevGuide. Graphics [Электронный ресурс]. URL: http://developer.android.com/guide/topics/graphics/index.html] (дата обращения: 25.01.2012).

Научный руководитель:
Доцент кафедры математического обеспечения вычислительных систем ПГНИУ,
к.ф.-м.н., доцент Залогова Л.А.

Просмотров работы: 16