netlib.narod.ru | < Назад | Оглавление | Далее > |
Самой фундаментальной частью трехмерного объекта является вершина. Математически вершины представляются исключительно их трехмерными координатами (которые отображаются на тип данных Vector3 в XNA), но в XNA они включают дополнительную информацию, такую как цвет, текстура или данные вектора нормали, в зависимости от используемого формата вершин. В таблице 7.1 представлены определения вершин, предоставляемые XNA Framework.
Таблица 7.1. Определения структур форматов вершин в XNA
Формат вершин | Описание |
VertexPositionColor | Определяет вершину с местоположением и цветом визуализации |
VertexPositionTexture | Определяет вершину с местоположением и координатами текстуры, описываеющими, как заданная текстура отображается на эту вершину, где (0, 0) является координатой верхнего левого угла текстуры, а (1, 1) соответствует правому нижнему углу текстуры |
VertexPositionColorTexture | Определяет вершину с местоположением, цветом и координатами текстуры |
VertexPositionNormalTexture | Определяет вершину с местоположением, вектором нормали и координатами текстуры |
Помимо местоположения вершин и дополнительных данных, при создании трехмерных объектов вам надо указать, как XNA будет соединять эти вершины в различные примитивы рисования.
Примитивы рисования, или трехмерные примитивы, объясняют XNA как набор вершин (называемый в XNA буфер вершин, vertex buffer) будет визуализирован при вызове функции рисования. Вершины могут рисоваться как набор изолированных точек, как набор линий или как треугольники.
Треугольники используются как основа для создания любых других двухмерных или трехмерных объектов. Это вызвано тем, что для примитива, определенного только тремя точками, гарантируется, что он будет находиться в одной плоскости и будет выпуклым (линия, соединяющая любые две точки, находящиеся внутри треугольника, всегда полностью находится внутри треугольника, что не всегда справедливо для фигур, состоящих из четырех точек). Эти характеристики являются ключом к возможности быстрой визуализации в видеокартах, которые всегда используют в качестве основного типа примитивов визуализации треугольники.
Так, например, если вы хотите нарисовать на экране квадрат, следует использовать два треугольника. Если вы хотите создать куб, используется 12 треугольников (по 2 для каждой грани), как показано на рис. 7.4.
Рис. 7.4. Куб, составленный из треугольников
В XNA у объекта графического устройства есть метод с именем DrawPrimitives, который применяется для рисования содержимого буфера вершин, согласно заданному типу примитива, определенному в перечислении PrimitiveType:
PointList: каждая вершина визуализируется отдельно от остальных, и вы видите набор отдельных точек. На рис. 7.5 показан набор вершин, визуализированный как список точек.
Рис. 7.5. Вершины, визуализированные как список точек
LineList: вершины визуализируются попарно, с линией, соединяющей каждую пару. Вызов закончится ошибкой, если вы передадите буфер вершин с нечетным количеством вершин. На рис. 7.6 показано использование примитива со списком линий.
Рис. 7.6. Те же вершины, визуализированные как список линий
LineStrip: все вершины из буфера визуализируются как единая ломаная линия. Это может быть полезно при отладке, поскольку данный тип примитива позволяет вам видеть каркасное изображение ваших объектов вместо набора вершин. На рис. 7.7 показан примитив ломаной линии.
Рис. 7.7. Те же вершины, визуализированные как ломаная линия
TriangleList: вершины визуализируются группами по три, как изолированные треугольники. Этот вариант предоставляет вам великолепную гибкость при визуализации сложных сцен, но имеет существенный недостаток в виде наличия дублирующихся вершин при рисовании соединенных треугольников. На рис. 7.8 показано применение списка треугольников для визуализации вершин.
Рис. 7.8. Те же вершины, визуализированные как список треугольников
TriangleStrip: вы используете этот тип примитива, когда рисуете соединенные треугогльники. Он более эффективен для визуализации сцен, поскольку вам не надо повторять дублирующиеся вершины. Каждая добавляемая к буферу новая вершина (после двух первых) создает новый треугольник, используя две последних вершины. На рис. 7.9 показан пример полосы треугольников.
Рис. 7.9. Те же вершины, визуализированные как полоса треугольников
TriangleFan: в этом примитиве все треугольники совместно используют общую вершину — самую первую в буфере — и каждая добавленная новая вершина создает новый треугольник, использующий первую вершину и последнюю из определенных. На рис 7.10 показан этот последний тип примитива — веер треугольников.
Рис. 7.10. Те же вершины, визуализированные как веер треугольников
netlib.narod.ru | < Назад | Оглавление | Далее > |