7. Ogre3D: Мануальные объекты Ogre3D

04.07.2012

Представление объектов в трехмерном пространстве

Наш разговор о мануальных объектах Ogre3D следует начать с того, из чего состоит трехмерная модель. Наиболее сложный вопрос при программировании трехмерной графики – это вопрос производительности. Существует большое количество способов для передачи информации о рисуемом объекте на видеокарту. Наверняка многие из нас еще в школе пробовали рисовать простые картинки средствами вывода Turbo Pascal. Как вы понимаете, это не самый оптимальный способ. Необходимо понимать, что, при рисовании объекта из оперативной памяти компьютера, информацию об этом объекте необходимо будет передавать в память графического процессора каждый раз при рисовании кадра. Это нанесет большой урон производительности даже при рисовании простейших объектов. Для решении этой проблемы информацию о графическом объекте закачивают в видеопамять еще до рисования. То есть, фактически, на момент рисования видеопамять содержит ряд буферов с информацией, и мы лишь передаем команду отрисовать эти буферы. Давайте попробуем разобраться, какая информация хранится в этих буферах. Основная структурная единица трехмерной модели – это вертекс. Вертекс – это точка в трехмерном пространстве, которая имеет свои координаты. Соединяя вертексы ребрами и закрашивая получившиеся примитивы текстурами, мы получаем трехмерные модели. Минимальным примитивом трехмерной графики является треугольник. Существуют способы вывода трехмерной графики с помощью других примитивов, однако большинство современных видеокарт на текущий момент наиболее оптимизированным образом выводят именно треугольники. Несложно предположить, что любой из вертексов может использоваться в трехмерной модели не один раз. Например, в квадрате, состоящем из двух треугольников, два вертекса будут использованы дважды.

Треугольник 1: 1, 2, 4
Треугольник 2: 1, 4, 3

Для экономии памяти в случае, когда вертекс используется неоднократно, используются индексы. Индексы – это способ пометить, в каком порядке вертексы входят в состав примитивов. Например, для предыдущего случая нам бы понадобилось 6 вертексов, в случае с индексами — 4 вертекса + индексы. Т.к. вертекс и информация о нем занимает существенно больше памяти, для больших моделей экономия памяти значительная. Помимо вертексов и индексов в графических буферах бывает информация о цветах вершин. То есть каждый вертекс несет информацию о том, какого он цвета. Когда примитив попадает в графический процессор на отрисовку, эта информация определенным образом интерполируется между вершинами, и мы получаем цветовую заливку примитивов. Также важной составляющей информацией о трехмерной модели является текстурные координаты. Текстурные координаты – это способ, задать каким образом текстурный атлас ложится на вертексы. Мы можем иметь большое количество наборов текстурных координат на каждый из вертексов. Таким образом мы можем производить сложные смешивания текстур, операции с масками и т.д. То есть, фактически, трехмерная модель содержит информацию о точках, о соединениях между этими точками, о цветах этих точек и о способе наложения текстур на эти точки.

Мануальные объекты

В большинстве случаев трехмерная модель создается с помощью специальных трехмерных редакторов, таких как 3ds Max, Maya. Однако бывают ситуации, когда информацию о трехмерной модели необходимо задать вручную. В качестве примеров можно предложить процедурную генерацию трехмерной модели, какие-либо простые формы и т.д. Для решения этой задачи в составе Ogre3D есть специальный класс Ogre::ManualObject. Создать мануальный объект можно методами менеджера сцены:

Ogre::ManualObject* manual = pSceneManager->createManualObject();

После создания объект необходимо наполнить информацией о модели. Делается это между вызовами begin() и end(). Вызов метода end() сигнализирует о завершении работы с мануальным объектом. После этого вызова дополнять мануальный объект нельзя.

manual->begin( material, Ogre::RenderOperation::OT_TRIANGLE_FAN );
manual->end();

В первый вызов передается название скрипта материала (например, «Examples/OgreLogo») и тип рисуемых примитивов. Корректные значения:

Ogre::RenderOperation::OT_LINE_LIST Линии списком
Ogre::RenderOperation::OT_LINE_STRIP Соединенные линии
Ogre::RenderOperation::OT_POINT_LIST Точки списком
Ogre::RenderOperation::OT_TRIANGLE_FAN Треугольники веером
Ogre::RenderOperation::OT_TRIANGLE_LIST Треугольники списком
Ogre::RenderOperation::OT_TRIANGLE_STRIP Соединенные треугольники

В мануальный объект вы можете удобным образом передать любую информацию о модели:

manual->position(…) Добавить вертекс
manual->colour(…) Цвет вертекса
manual->index(…) Значение индекса
manual->textureCoord(…) Текстурные координаты

При заполнении не забывайте о кратных соотношениях между вертексах, индексах и т. п. Это соотношение зависит от выбранного вами типа примитива. Пример заполнения:

Ogre::ManualObject* manual = pSceneManager->createManualObject();
manual->begin( material, Ogre::RenderOperation::OT_TRIANGLE_FAN );
 
manual->position( - width / 2, - heigth / 2, z );
manual->textureCoord( Ogre::Vector2( 0, 1 ) );
 
manual->position( width / 2, - heigth / 2, z );
manual->textureCoord( Ogre::Vector2( 1, 1 ) );
 
manual->position( width / 2,  heigth / 2, z );
manual->textureCoord( Ogre::Vector2( 1, 0 ) );
 
manual->position( - width / 2,  heigth / 2, z );
manual->textureCoord( Ogre::Vector2( 0, 0 ) );
 
manual->index(0);
manual->index(1);
manual->index(2);
manual->index(3);
manual->index(0);
 
manual->end();
 
Ogre::SceneNode *node = pSceneManager->getRootSceneNode()->createChildSceneNode();
node->attachObject( manual );

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

avatar

Об Авторе ()

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

Комментарии ()

Обратная URL | RSS фид комментариев

  1. avatar bu66legum:

    1й абзац: «закачивают в память видеопамяти»
    сурово)

  2. avatar madeinsoviets:

    Да, мы суровые парни;) Почистим, спасибо…

Наверх