netlib.narod.ru< Назад | Оглавление | Далее >

Сердце трехмерной графики

Хотя переход к такой сложной теме как трехмерная графика на данном этапе чтения книги может показаться нелогичным, в нем есть своя логика. Определенно, вся графическая система DirectX базируется на трехмерном прорыве Microsoft — Direct3D. Поэтому все, что вы будете делать с DirectX Graphics, изложено в терминологии трехмерной графики.

ПРИМЕЧАНИЕ
В этом разделе я познакомлю вас с терминологией трехмерной графики и теорией рисования трехмерных изображений. Далее в этой главе, в разделе «Переходим к рисованию» вы примените теорию на практике, начав рисовать с использованием DirectX Graphics.

Все, и я действительно подразумеваю все, что рисуется с помощью Direct3D состоит из полигонов. Полигон (polygon) — это обычно треугольная фигура, образованная тремя точками, называемыми вершины. Вершина (vertex) — это минимальная единица в трехмерной графике; единственная точка (с коррдинатами) расположенная в двухмерном или трехмерном пространстве. Вы создаете ребра (линии), соединяя между собой две вершины, а три ребра образуют полигон. Вы можете думать об этих взаимосвязях между вершинами, ребрами и полигонами как об игре «соедини точки». Точки — это вершины, а линии, которые вы рисуете, — это ребра.

Три соединенных ребра образуют грань (polygon face), а весь рисунок называется сеткой (mesh) или моделью (сетка — это результат объединения всех базовых объектов: вершин, ребер и полигонов). Взаимосвязь между вершинами, ребрами, полигонами и сетками показана на рис. 2.1.


Рис. 2.1. Соединяем точки для создания трехмерного объекта

Рис. 2.1. Соединяем точки для создания трехмерного объекта


Чтобы представление объектов выглядело более реалистично, Direct3D использует материалы (materials) для закрашивания пустых полигонов сетки указанным цветом. Материалы представляются в виде комбинации цветовых компонент, а также необязательных растровых изображений, называемых текстуры (texture), которые в процессе визуализации наносятся на поверхность полигона.

Системы координат

Скорее всего, вы уже знакомы с использованием двухмерной системы координат, если имели дело с изображениями, у которых есть ширина и высота, измеренные в пикселях. Горизонтальный отступ называют координатой X, а вертикальный отступ называют координатой Y. Каждая координата является смещением от верхнего левого угла изображения.

Система координат изображена на рис. 2.2. Координата X направлена слева направо от расположенного в крайней левой позиции начала координат. Координата Y направлена сверху вниз от расположенного на самом верху начала координат. Координаты увеличиваются в положительном направлении к другому концу их промежутков. В Direct3D двухмерные координаты обычно называют преобразованными координатами (transformed coordinates) потому что они представляют собой финальные координаты, используемые для рисования объекта на экране.


Рис. 2.2. Вы указываете координаты в изображении используя соответствующие координаты X и Y

Рис. 2.2. Вы измеряете ширину и высоту изображения в пикселях. Вы указываете координаты в изображении используя соответствующие координаты X и Y


В трехмерном пространстве добавляется дополнительная координата — координата Z. Обычно координата Z представляет глубину изображения. Что более важно, координата Y переворачивается и направлена снизу вверх (положительное направление направлено вверх). Эта раскладка трех координат показана на рис. 2.3. Координата Z может использоваться двумя способами: когда положительное направление идет от зрителя или, когда положительное направление идет к зрителю. Эти два варианта обычно называются левосторонней (left-handed) и правосторонней (right-handed) координатными системами соответственно. В этой книге я использую левостороннюю систему координат.


Рис. 2.3. Трехмерные координаты: X, Y и Z

Рис. 2.3. Трехмерные координаты: X, Y и Z. X и Y аналогичны координатам на экране, а координата Z представляет глубину изображения


 

ПРИМЕЧАНИЕ
Левосторонняя и правосторонняя системы координат получили свои названия на основании способа определения направления третьей координаты с помощью руки. Разместите левую руку, чтобы ладонь была направлена вверх. Направьте большой палец от вас (остальные пальцы должны быть направлены вправо). Ваш большой палец указывает положительное направление оси Z, а остальные пальцы указывают положительное направление оси X. Теперь согните пальцы, чтобы они указывали вверх (не меняя положения руки), и они будут указывать положительное направление оси Y. Это справедливо для левосторонней системы координат. В случае с правосторонней системой координат все обстоит точно так же, но использовать надо правую руку.

Все в трехмерном мире измеряется в таких координатных системах — двухмерной для изображений и экрана и трехмерной для всего остального. Так, если вам требуется определить (с помощью трехмерных координат) точку пространства, находящуюся перед вами (по оси Z), немного правее вас (по оси X) и на уровне глаз (по оси Y), вы можете задать для нее координаты X = 100, Y = 50, Z = 200. Эти координаты представляют точку, находящуюся в 100 единицах справа от вас, в 50 единицах над землей и в 200 единицах перед вами соответственно.

В случае двухмерных координат вы можете сказать, что картина на стене имеет 200 пикселей в ширину и 200 пикселей в высоту. Центр этой картины будет в точке X = 100, Y = 100, а верхний левый угол — в точке X = 0, Y = 0. Трехмерные координаты называют непреобразованными координатами (untransformed coordinates), поскольку они не представляют итоговые координаты, которые будут использоваться для визуализации объекта на дисплее. С другой стороны, двухмерные координаты называют преобразованными координатами (transformed coordinates), поскольку они непосредственно отображаются в координаты точек экрана. Позднее в этой главе, в разделе «Трехмерная математика», вы увидите как преобразовать непреобразованные координаты в преобразованные, а сейчас давайте сосредоточимся на том, как определить объекты, используя координаты о которых мы только что прочитали.

Конструирование объектов

Конструируя объекты, такие как сетки и модели (и даже плоские двухмерные изображения), вы начинаете с уровня вершин. У каждой вершины есть назначенные ей координаты X, Y и Z. Вы можете задать эти координаты тремя способами: в экранном пространстве (screen space) используя преобразованные координаты, в пространстве модели (model space) используя непреобразованные координаты, и в мировом пространстве (world space) также используя непреобразованные координаты.

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

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

Когда вы перемещаетесь по дому (в мировом пространстве), координаты ваших суставов в мире меняются, но относительно центра вашего тела остаются постоянными, как это показано на рис. 2.4.


Рис. 2.4. Изредка при перемещении объекта в мире вы будете непосредственно манипулировать координатами вершин объекта

Рис. 2.4. Изредка при перемещении объекта в мире вы будете непосредственно манипулировать координатами вершин объекта. Чаще вместо этого вы указываете местоположение объекта, задавая его координаты в мировом пространстве, и позволяете Direct3D самому беспокоиться о размещении вершин


После выбора типа координат, используемых для рисования объекта (в экранном, локальном или мировом пространстве), вы размещаете вершины (нумеруя их в порядке их размещения). Затем вы объединяете эти вершины в группы по три для создания треугольных граней. На рис. 2.5 показан набор полигональных граней созданных путем группировки вершин.


Рис. 2.5. Вы используете шесть вершин для рисования двух полигонов

Рис. 2.5. Вы используете шесть вершин для рисования двух полигонов. Каждый полигон должен быть треугольником, поэтому каждый полигон использует только три вершины


Списки, полосы и веера

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

Список треугольников (triangle list) — это набор граней не имеющих общих вершин, поэтому у каждого полигона свое трио вершин. Полоса треугольников (triangle strip) — это набор граней с общими вершинами в котором у каждого полигона общее ребро с другим. Веер треугольников (triangle fan) получается в том случае, если несколько граней совместно используют одну и ту же вершину, подобно соединенным в одной точке пластинам настоящего веера. Эти три категории показаны на рис. 2.6.


Рис. 2.6. В списке треугольников, в отличие от полос и вееров треугольников, вершины совместно не используются

Рис. 2.6. В списке треугольников, в отличие от полос и вееров треугольников, вершины совместно не используются. Применение полос и вееров сокращает количество вершин, что экономит память и увеличивает скорость визуализации


Помимо использования треугольных полигонов у вас есть возможность визуализировать отдельные пиксели и линии. В Direct3D отдельные рисуемые пиксели называются точками (point), а линии называются... да так и называются, линиями (line). Для визуализации точек и линий используются соответственно одна и две вершины. Поскольку мы сосредотачиваемся на трехмерной графике, я пропущу обсуждение типов точек и линий и сосредоточусь исключительно на типах треугольников.

Порядок вершин

Позднее, когда вы переходите к визуализации полигонов, очень важен порядок, который использовался при определении вершин, потому что вы должны определить, какая сторона грани является лицевой, а какая — обратной. Для текущих целей вы будете упорядочивать вершины, которые определяют грань так, чтобы они шли по часовой стрелке (когда вы смотрите на лицевую сторону полигона), как показано на рис. 2.7. Таким образом, если образующие грань вершины идут по часовой стрелке, то вы знаете, что смотрите на лицевую поверхность грани.


Рис. 2.7. Обратите внимание на порядок вершин

Рис. 2.7. Обратите внимание на порядок вершин, поскольку при конструировании списков, полос и вееров для вершин используются особые порядки вершин


 

ПРИМЕЧАНИЕ
В системах трехмерной графики обращенные к зрителю обратной стороной грани обычно не рисуются и игнорируются в процессе визуализации. Этот процесс называется отбрасыванием обратных граней (backface culling) и является одним из основных способов оптимизации. В правосторонней системе координат все выглядит с точностью до наоборот, и лицевой стороной к зрителю обращены те грани, у которых вершины идут против часовой стрелки.

Проницательные читатели вероятно заметили, что в полосе треугольников на рис. 2.7, для каждого следующего треугольника порядок вершин меняется на противоположный. Это изменение порядка вершин необходимо для рисования полос треугольников в Direct3D.

Окрашивание полигонов

После того, как вы определили группы полигонов или сетку, вы готовы раскрашивать грани. Direct3D предлагает две простых техники, которые я буду обсуждать в этой книге. Первая техника использует определения материалов (material), которые фактически являются простыми цветами. Для материалов задаются их рассеиваемая, фоновая и отражаемая цветовые компоненты. Рассеиваемый (diffuse) и фоновый (ambient) цвета обычно один и тот же цвет, — тот цвет в который действительно окрашен объект. Отражаемый (specular) цвет — это цвет бликов, появляющихся на объекте, если осветить его близко расположенным источником света. (Подробнее об этих трех цветовых компонентах мы поговорим позже в разделе «Материалы и цвета» этой главы.)

Вторая техника, называемая наложение текстур (texture mapping), раскрашивает полигоны используя изображение. Сама текстура является изображением, обычно загружаемым из файла с растровой графикой. Это растровое изображение натягивается или накладывается повторяющейся мозаикой на поверхность полигона.

Преобразования

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


Рис. 2.8. Обратите внимание на порядок вершин

Рис. 2.8. Хотя вы определяете трехмерные объекты в их собственных локальных пространствах, потом вы должны разместить их в мировом пространстве


Такие действия, как передвижение (также называемое перемещением, translating), вращение и масштабирование называются преобразованиями (transformation). Для того, чтобы перенести объект из его пространства модели в готовую к просмотру систему координат необходим набор преобразований.

Первое из них, мировое преобразование (world transformation), применяется для преобразования объекта из его локальных коодинат в мировые координаты. Это включает масштабирование, вращение относительно осей X, Y и Z, и перемещение (именно в этом порядке). Следующее преобразование — это преобразование вида (view transformation), которое ориентирует все объекты относительно точки просмотра в трехмерном мире, то есть преобразует мировые координаты в координаты вида.

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

Последнее важное преобразование — это преобразование проекции (projection transformation), которое преобразует ваш трехмерный мир в его двухмерное изображение. Оно похоже на объектив камеры с изменяемым фокусным расстоянием, настраиваемыми углами обзора и различными эффектами, такими как сверхширокоугольный обзор.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz