4. Ogre3D: SceneManager, SceneNode, Camera

28.06.2012

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

Граф сцены позволяет удобным для программиста образом организовать навигацию по объектам в сцене. Простейший вариант графа — это лист или массив ссылок на объекты. Таким образом, у нас есть массив или лист, при создании графического объекта мы добавляем ссылку на данный объект в этот массив или лист, и, соответственно, при рисовании кадра, графический движок проходит по этому массиву и рисует каждый из объектов по ссылке. При удалении объекта ссылка на объект чистится. Такой способ организации позволяет сразу же сэкономить память. Для того чтобы отрисовать два однотипных объекта вам необходимо загрузить этот объект в память лишь один раз. Однако организация графической сцены в виде листа имеет свои неудобства. Например, вы не можете организовать объекты в иерархию.

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

SceneManager

SceneManager – это менеджер, который работает с графом сцены Ogre3D. Основная задача его — скрыть от программиста непосредственную работу по созданию и поддержке графа сцены в Ogre. Помимо этого SceneManager обращается к соответствующим классам графического движка для загрузки и освобождения ресурсов. SceneManager позволяет удобным образом создавать объекты, искать их в графе и удалять их. Его можно найти среди protected членов базового приложения. SceneManager позволяет создавать и удалять практически все объекты Ogre3D, начиная от трехмерных моделей и заканчивая двухмерными оверлеями.

void TutorialApplication::createScene(void)
{
    using namespace Ogre;
 
    // устанавливаем амбиент освещение
    mSceneMgr->setAmbientLight( ColourValue( 0.7, 0.7, 0.7 )  );
 
    // создаем узел сцены и 3д модель
    Entity *pAthene = 
	  mSceneMgr->createEntity( "athene", "athene.mesh" );
 
    SceneNode *pAtheneNode = 
        mSceneMgr->getRootSceneNode()->createChildSceneNode( "AtheneNode" );
 
    // присоединяем модель к узлу сцены
    pAtheneNode->attachObject( pAthene );
}

SceneNode

Основной структурной единицей графа сцены Ogre3D является узел сцены. SceneNode — это ветвь в терминологии паттерна Композит. Узел сцены может содержать в себе как графические объекты, так и другие узлы сцены. Создать узел сцены можно либо при помощи сцен менеджера, либо при помощи соответствующих методов самого узла.

SceneNode *pCarNode =
    mSceneMgr->getRootSceneNode()->createChildSceneNode( "Car" );
pCarNode->createChildSceneNode( "Wheel1" );
pCarNode->createChildSceneNode( "Wheel2" );
pCarNode->createChildSceneNode( "Wheel3" );
pCarNode->createChildSceneNode( "Wheel4" );
pCarNode->createChildSceneNode( "Door1" );
pCarNode->createChildSceneNode( "Door2" );

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

pSceneNode->setPosition(...);
pSceneNode->translate(...);
pSceneNode->setOrientation(...);
pSceneNode->rotate(...);
pSceneNode->setScale(...);
pSceneNode->scale(...);
pSceneNode->yaw(...);
pSceneNode->pitch(...);
pSceneNode->roll(...);

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

Camera

Следующим важным объектом графа сцены Ogre3D является трехмерная камера. Камера является представлением наблюдателя в сцене. Камера может быть как одна, так и несколько.

SceneManager позволяет удобно настраивать и переключаться между камерами. Камера по умолчанию также располагается среди protected членов базового приложения. Основными методами камеры являются методы навигации в пространстве. Эти методы схожи с методами SceneNode. Отдельно стоит отметить лишь метод

mCamera->lookAt( 0.0f, 0.0f, 0.0f );

Этот метод позволяет направить камеру на определенную точку — это бывает очень полезно для отслеживания объектов.

Заполнен: Ogre3D
Присвоен тэг:

avatar

Об Авторе ()

Коллективный разум нашей редакции. Все человеческое здесь заканчивается и начинается C++!

Комментирование закрыто.

Наверх