Pull to refresh

Погружаемся в 3D с помощью Marmalade SDK

Reading time4 min
Views12K
Приветствую, братья по цеху, а также просто интересующиеся мобильными платформами и 3D-графикой читатели. В предыдущем посте (а также в майском номере журнала «Хакер») я уже писал о том как начать работать с AirplaySDK (с некоторых пор он теперь называется Marmalade) — инструментарием, позволяющим создавать мобильное приложение на C++ один раз и впоследствии компилировать его на множество платформ: iOS, Android, Windows Mobile, Bada, Symbian и т. д. HelloWorld-приложение — это уже что-то, но останавливаться на достигнутом мы с вами не любим, а потому в этой статье речь пойдёт уже о создании небольшого 3D-приложения. Описываемый SDK имеет добрую документацию, а потому я ограничусь лишь небольшим примером создания 3D-модели, её загрузки в наше мобильное приложение и смены ракурса камеры для просмотра сцены. Ну что же, приступим?

Подготовка к работе


Итак, для начала создадим в Maya обычную коробку и закрасим её в синий цвет.



С вашего позволения я не буду перегружать статью мануалом по созданию коробок в Maya, так как это не основная тема нашего сегодняшнего разговора, да и я далеко не специалист по работе в Maya.

Итак, коробка создана. Теперь нам следует установить плагин для экспорта модели в специальный формат для Marmalade SDK. Для этого нужно выполнить следующие операции копирования файлов:

<SDK install>/Tools/Exporters/Maya/ASMaya212Exporter.mll -> <Maya2012Location>/bin/plug-ins
<SDK install>/Tools/Exporters/Maya/ASExpUI.dll -> <Maya2012Location>/bin/plug-ins
<SDK install>/Tools/Exporters/Maya/exporter.txt -> <Maya2012Location>/bin/plug-ins
<SDK install>/Tools/Exporters/Maya/metabase.txt -> <Maya2012Location>/bin/plug-ins
<SDK install>/s3e/bin/libeay32.dll -> <Maya2012Location>/bin

где <SDK install> — путь к папке с установленным SDK, <Maya2012Location> — папка установки Maya 2012. Прошу заметить что для разных версий Maya процесс установки разный. Подробнее об этом читайте в документации (а так же обратите внимания на наличие инструкции по установке не только для Maya, но и для 3dsMax).

Теперь открываем Maya и в меню Windows > Settings/Preferences > Plug-in Manager устанавливаем галочки loaded и auto load напротив ASMaya212Exporter.mll.

Плагин установлен. Открываем наш проект с созданной коробкой и в консоли MEL вводим команду ASMayaExporter.

Экспорт модели


По команде ASMayaExporter у Вас появится окно экспорта модели.



Для начала натравите параметр Project Data Directory на директорию data Вашего проекта. В прошлом посте мы разбирали что это за директория и с чем её едят. В неё будет сохраняться наша 3D-модель. Так же обязательным является поле Asset name, где вы должны указать имя своей модели. Давайте назовём её FirstBox, так будет удобнее.

Теперь о необязательных, но не менее важный параметрах. Слова geometry, skeleton, animation говорят сами за себя, а вот параметр oneGeo я уже опробовал на своей шкуре. Если Ваша модель будет состоять из нескольких составных частей — обязательно отметьте это поле, чтобы получить единый GEO-файл для Вашей модели, а не десятки для каждого из примитивов модели.

Теперь нажимаем кнопку Export и наша модель появляется в директории data.

Пишем код


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

Для начала приведу исходник единственного файла с главной функцией main():

#include "IwGx.h"
#include "IwGraphics.h"
#include "IwResManager.h"

int main()
{
	IwGxInit();
	IwGraphicsInit();

	IwGetResManager()->LoadGroup("FirstBox.group");	
	CIwModel* pModel = (CIwModel*)IwGetResManager()->GetResNamed("FirstBox", "CIwModel");

	IwGxSetLightType(1, IW_GX_LIGHT_DIFFUSE);
	CIwSVec3 dd(0xFF, 0xFF, 0xFF);
	IwGxSetLightDirn(1, &dd);

	IwGxSetPerspMul(0xAF);

	while( !s3eDeviceCheckQuitRequest() )
	{
		IwGxClear( IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F );

		IwGxLightingOn();

		CIwMat view = CIwMat::g_Identity;
		view.t.z = -80;
		view.t.y = 80;
		view.t.x = -60;
		view.LookAt(view.GetTrans(), CIwVec3(0, 0, 0), -CIwVec3::g_AxisY);
		IwGxSetViewMatrix(&view);

		CIwMat modelMatrix = CIwMat::g_Identity;
		IwGxSetModelMatrix(&modelMatrix);

		pModel->Render();

		IwGxFlush();
		IwGxSwapBuffers();
		s3eDeviceYield(0);
	}

	IwGraphicsTerminate();
	IwGxTerminate();

	return 0;
}

Код весьма прост даже для неискушённого программиста. Но некоторые моменты я поясню.

После экспорта модели в папке data появится файл FirstBox.group. Как раз его мы и загружаем в строке:
IwGetResManager()->LoadGroup("FirstBox.group");

После загрузки файла ресурсов загружаем непосредственно модель, созданную в Maya:
CIwModel* pModel = (CIwModel*)IwGetResManager()->GetResNamed("FirstBox", "CIwModel");

Так же следует обратить особое внимание на функцию IwGxSetPerspMul(...). Это своего рода установка степени эффекта «рыбьего глаза». Если оставить этот параметр по умолчанию, то ваши сцены по краям экрана будут создавать впечатление просмотра через дырку унитаза донышко от бутылки.

Объект view представляет собой взгляд на сцену. Его поле t с параметрами x, y и z задаёт положение камеры в пространстве. Метод LookAt определяет направление взгляда: первый параметр — установленное в предыдущих трёх строках положение (from), второй — точка в пространстве, на которую нужно направить взгляд (to), и третий параметр — это направление вверх (т.е. если бы мы, например, установили CIwVec3::g_AxisY вместо -CIwVec3::g_AxisY, то смотрели бы на сцены «вверх ногами»).

modelMatrix задаёт матрицу преобразования модели. Выкинув из головы столь занудный термин я объясню проще: с помощью этого объекта мы задаём такие параметры, как поворот модели и положение в пространстве.

Ну и, конечно же, стоит выложить скриншот полученной сцены:


Заключение


Конечно, я не ставил целью в рамках данной статьи рассказать Вам обо всех возможностях работы с 3D в Marmalade SDK. Сцена весьма примитивна, но всё остальное Вы сможете почерпнуть либо из документации к инструментарию, либо, если читатели проявят интерес к теме, я буду писать на эту тему побольше статей. Так что надеюсь на ваши отзывы и на то что появятся причины написать продолжение к моим статьям.

UPD. С некоторых пор Airplay SDK переименован в Marmalade SDK.
Tags:
Hubs:
+23
Comments13

Articles