Программирование 3D графики для мобильных устройств.
Технология M3G
Данная статья служит нескольким целям:
- Дать краткое описание технологии M3G
- Рассмотреть инструменты, которые необходимы для успешного создания игрового 3D приложения.
- Кратко рассмотреть структуру созданного простого игрового приложения.
Как упоминалось выше M3G, есть набор классов которые находятся в пакете javax.microedition.m3g, и по сути является надстройкой над библиотеками OpenGL ES. На момент описания работы текущей версией стандарта есть M3G1.1, и ведутся работы над созданием версии M3G 2.0. В состав пакета входит 30 классов, и существует 2 общепринятых режима работы приложения:
-
Immediate mode — режим в котором за вывод каждого объекта напрямую отвечает программист. Базовыми классами в этом режиме являются : VertexArray, VertexBuffer, IndexBuffer, Appearance Transform. Работать с большими миром используя этот режим достаточно трудоёмко.
-
Retained mode — Данный режим поднимается на более высокий уровень абстракции по сравнению с режимом Immediate. Базовыми классами с которыми чаще всего приходится работать являются потомки класса Node, с помощью которых можно легко построить, или загрузить сложный граф сцены. Работать в данном режиме гораздо легче, и интуитивно понятнее, а вывод осуществляется одной из самых «мощных команд» graphics3d.render(world), которая осуществит вывод на экран всего графа сцены за одно обращение. Также не наложено никаких запретов на совместное использование обоих режимов совместно. На рисунке 1 приведен пример простого графа сцены.
Рисунок 1 — Структура простой сцены
Программные средства необходимые для создания Java 3D приложения:
Sun Java Wireless Toolkit (часто упоминается как «WTK») — бесплатный набор средств разработки программ для мобильных телефонов и других устройств, поддерживающих платформу Java ME. Включает в себя набор классов JavaME(для компиляции с помощью JDK), эмулятор, профилировщик, монитор памяти, набор документации и примеры мидлетов. Ранее известен как Java 2 Platform, Micro Edition Wireless Toolkit.
NetBeans IDE 6.8 или Eclipse - Интегрированные среды разработки значительно облегчают процесс создания приложения, а также дают полноценную возможность отлаживать скомпилированный код. Для меня более дружелюбной показалась среда NetBeans IDE 6.8, по причине необходимости внесения минимального количества изменений в настройки для её корректной работы. Eclipse требует установки дополнительных модулей, и более длительной настройки, но и имеет свои достоинства.
Создание 3D модели является важным моментом в процессе создания игрового приложения. Как упоминалось выше сложные модели, практически невозможно создать программно без использования 3D редактора. Для работы в приложениях построенных с помощью M3G создан одноимённый графический формат. К сожалению не существует редакторов которые поддерживают прямое редактирования файлов в формате *.M3G, поэтому для создания полноценной 3D модели используются широко известные 3D реакторы, и не многочисленные конвертеры, которые предназначены для конвертирования модели из родного формата редактора в формат Mobile 3D Graphics.
Для создания моделей я использовал 2 редактора:
-
Autodesk 3ds Max — начиная с версии 2008 с установкой данного программного продукта, устанавливается и конвертер.
-
Blender — бесплатный 3D редактор, по функциональности ничем не отличающийся от 3ds Max, но к сожалению конвертер необходимо брать у стороннего разработчика, и он иногда работает не корректно при импорте моделей с текстурами, даже при соблюдении рекомендаций.
Также хочу ещё пару слов сказать о двух продуктах заслуживающих внимания:
-
H3T Exporter — качественный плагин доступный для редакторов 3ds Max, Maya, LightWave3D, который позволяет импортировать модели с использованием промежуточного формата H3T. Недостаток состоит в том, что плагин работает с соответствующими материалами H3T, и процесс работы с ними также отличается от работы с стандартными материалами с точки зрения текстурирования.
-
M3GViewer — бесплатная программа, служащая для просмотра структуры файлов в формате M3G, обладает немаловажной функциональной особенностью. Позволяет выбрать и сохранить в отдельный файл любую составную часть просматриваемого файла, для дальнейшей его загрузки в вашу программу.
Можно сформулировать следующие рекомендации по созданию модели для мобильного 3D приложения:
-
Располагайте модели в 3D редакторе так, чтобы они изначально совпадали с координатной системой M3G.
-
Размер текстур должен быть кратный степени 2 и не превышать 256px, те 16х16, 32х32, 64х64,128х128 и 256х256.
-
Нет необходимости создавать очень детализированные модели, т.к. они очень сильно влияют на размер приложения, но не способны быть также качественно отображены на реальном устройстве.
-
Нет необходимости сохранять всю структуру файла, включающую World, Camera, Light. Сохраняйте только объект, используйте для этого M3GViewer. Пример приведен на рисунке 2. Данная процедура позволяет убрать избыточные данные из файла и уменьшить его размер иногда на 50 %.
Рисунок 2 — Структура файла с избыточной и без избыточной информации
Создаваемое приложение на данный момент имеет следующую структуру:
-
Main — класс наследующий MIDlet, в задачи которого входит организация начальной работы приложения, переход между экранами, организация простого меню.
-
GameFrame — класс наследник GameCanvas, в задачи данного класса входит инициализация игрового процесса, вызов загрузки необходимых ресурсов, обработка действий пользователя, вызов расчёта физики, и отображение каждого кадра, с заданной периодичностью.
-
Пакет my3D.Loader — содержит набор классов позволяющих организовать загрузку объектов в оперативную память, и эффективное их хранение: Основным классом является my3D.Loader -сингельтон предназначенный для загрузки составной 3D модели и выполнения первоначальных трансформаций заданных в файле структуры,структура модели должна быть представлена в формата XML.Класс обезпечивает сохранение ссылок на уже загруженный объект,что предотвращает их дублирование в памяти при обращении к файлу из которого модель уже загружалась. Если файл уже загружался и в данный момент находится в памяти, то фактического чтения не происходит. Модели делят всю информацию кроме той, что содержится в объектах классов javax.microedition.m3g.Appearance и javax.microedition.m3g.Transformable. Таким образом изменение внешности и положения одного объекта никак не скажется на остальных.
-
Пакет my3D.Physics содержит минимально необходимый набор классов позволяющих симулировать поведение игровых объектов. В этом пакете находятся следующие классы:
-
Solid — Абстрактный класс представляющий твёрдое тело, обладающее массой, позицией, и движущееся в пространстве под действием всех воздействующих на него сил.
-
MotorVehicle — Класс расширяющий функциональность Solid, моделирующий поведение колёсного средства передвижения, уточняются силы действующие на этот объект.
-
Simulator — Класс предназначенный для проведения симуляции как таковой, позволяет настроить частоту расчёта физики и сделать его более гладким и естественным с учётом маленькой вычислительной мощности мобильных устройств.
Несколько скриншотов отображены на рисунке 3.
Рисунок 3 — Снимки экранов 3D игрового приложения
Материалы по теме:
- Код примера.( Разработка автора, RAR-архив, размер 15 кБ, файлов 15)
- Kaufmann M. Mobile 3D Graphics with OpenGL ES and M3G/ M.Kaufmann// Elsevier, 2008 — 462
- Снук Г. Создание 3D-ландшафтов в реальном времени с использованием C++ и DirectX 9/ Г.Снук//Пер с англ. —M.: КУДИЦИН-ОБРАЗ, 2006. —368
- Урок 39. Введение в физический симулятор [Электронный ресурс] Режим доступа: http://pmg.org.ru/nehe/nehe39.htm
- Mobile 3D Graphics API. Википедия свободная энциклопедия [Электронный ресурс] Режим доступа: http://en.wikipedia.org/wiki/Mobile_3D_Graphics_API