Возможно вы искали: 'Fable Heroes'

May 11 2025 07:10:24
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96001592
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18342
• Обзор The Walking ... 18785
• Обзор DMC: Devil M... 19861
• Обзор на игру Valk... 15866
• Обзор на игру Stars! 17752
• Обзор на Far Cry 3 17933
• Обзор на Resident ... 16011
• Обзор на Chivalry:... 17494
• Обзор на игру Kerb... 17969
• Обзор игры 007: Fr... 16600
Превью о играх
• Превью к игре Comp... 17944
• Превью о игре Mage... 14447
• Превью Incredible ... 14704
• Превью Firefall 13460
• Превью Dead Space 3 16324
• Превью о игре SimC... 14713
• Превью к игре Fuse 15430
• Превью Red Orche... 15531
• Превью Gothic 3 16331
• Превью Black & W... 17342
Главная » Статьи » Всё о XNA » Урок 8. Как рисовать точки, линии и другие 3D примитивы

Урок 8. Как рисовать точки, линии и другие 3D примитивы

Урок 8. Как рисовать точки, линии и другие 3D примитивы.


В этом уроке мы рассмотрим, как можно нарисовать  простейшие примитивы (точки, линии, треугольники). 

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

Пометка – для простейшей отрисовки примитивов, кроме координат, вам необходимо создать экземпляр объекта BasicEffect а так же несколько матриц трансформации. Ссылки по теме How To: Use BasicEffect, и на нашем сайте - Как рисовать простые 3D-объекты с помощью BasicEffect.

Рисуем точки

1. Нужно создать список 3D вершин, которые определяют рисуемые точки.

Следующий код создает 8 точек и сохраняет их в массиве VertexPositionColor[] pointList;

1
2
3
4
5
6
7
8
9
10
pointList = new VertexPositionColor[points];
 
for (int x = 0; x < points / 2; x++)
{
    for (int y = 0; y < 2; y++)
    {
        pointList[(x * 2) + y] = new VertexPositionColor(
            new Vector3(x * 100, y * 100, 0), Color.White);
    }
}

 


Визуально точки будут выглядеть так -




На рисунке показаны 8 точек определяющих 6 треугольников нарисованных на плоскости Z (z=0). Координаты первой точки = (0,0,0). Камера размещена в точке (0,0,1) и смотрит на начало координат (0,0,0). Ортогональная проекция задана двумя точками – верхняя-левая (0,0) и нижняя-правая (800,600). Кроме этого мы используем дополнительную матрицу трансформации, которая смещает наши точки к центру экрана. Следующий код показывает создание 2-ух из 3-ех необходимых нам матриц. 3-яя матрица (мировая) для смещения точек к центру экрана создается в методе InitializeEffect()

1
2
3
4
5
6
7
8
9
10
11
12
viewMatrix = Matrix.CreateLookAt(
    new Vector3(0.0f, 0.0f, 1.0f),
    Vector3.Zero,
    Vector3.Up
    );
 
projectionMatrix = Matrix.CreateOrthographicOffCenter(
    0,
    (float)GraphicsDevice.Viewport.Width,
    (float)GraphicsDevice.Viewport.Height,
    0,
    1.0f, 1000.0f);

 



2. Используя свойство GraphicsDevice.RenderState.PointSize установим размер выводимых точек.

В нашем примере размер равен 10. На экране вы увидите квадратные точки.

GraphicsDevice.RenderState.PointSize = 10;

3. Выводим точки на экран используя функцию GraphicsDevice.DrawUserPrimitives(..) которая в качестве первого аргумента принимает тип выводимого примитива - PrimitiveType.PointList. Тип примитива определяет как данные в переданном массиве вершин будут интерпретированы и показаны.

1
2
3
4
5
GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
           PrimitiveType.PointList, // тип примитива для отрисовки
           pointList, // массив точек
           0,  // индекс первой используемой вершины в массиве
           8); // количество примитивов (точек)

 



Рисуем линии

1. В дополнение к списку 3D вершин точек нужно создать массив индексов для нумерации/индексации данных о вершинах.

Нижеприведенный код определяет индексы для серии линий

1
2
3
4
5
6
7
8
9
10
       // массив индексов для линий
       lineListIndices = new short[(points * 2) - 2];
 
       // заполняем индексы
       for (int i = 0; i < points - 1; i++)
       {
            lineListIndices[i * 2] = (short)(i);
            lineListIndices[(i * 2) + 1] = (short)(i + 1);
       }
 

 


Другими словами, данный код равнозначен следующему и определяет линии соеденяющие наши точки - pointList[0] и pointList[1], pointList[1] и pointList[2], и так далее 7 линий между 8-ми точек.

lineListIndices = new short[14]{ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7 };

2. Выводим линии на экран используя функцию GraphicsDevice.DrawUserIndexedPrimitives (..) которая в качестве первого аргумента принимает тип выводимого примитива - PrimitiveType. LineList


1
2
3
4
5
6
7
8
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
        PrimitiveType.LineList, // тип примитива для отрисовки
        pointList, // массив точек
        0,  // смещение, добавляемое для каждого индекса в индексном буфере
        8,  // количество вершин
        lineListIndices,  // индексный буфер соеденяющий наши точки по парам
        0,  // первый используемый индекс
        7); // количество примитивов (линий)

 




Рисуем ленту линий (Line Strip)

1. Для определения ленты из линий нам понадобится новый массив индексов в котором последовательно будут соеденены точки из массива вершин.

Для ленты нам понадобится в двое меньше индексов так как лента подразумевает последовательно соединенные примитивы (точки).

1
2
3
4
5
6
7
8
9
      // массив индексов для линий
      lineStripIndices = new short[points];
 
      // заполняем индексы последовательно соеденяя одну точку за другой
      for (int i = 0; i < points; i++)
      {
           lineStripIndices[i] = (short)(i);
      }
 

 


Или так –

lineStripIndices = new short[8]{ 0, 1, 2, 3, 4, 5, 6, 7 };

2. Выводим ленту линий на экран используя функцию GraphicsDevice.DrawUserIndexedPrimitives (..) которая в качестве первого аргумента принимает тип выводимого примитива - PrimitiveType. LineStrip. Пометка – рисование лент обычно более эффективно чем рисование списков - с точки зрения производительности, так как индексы выводимых вершин содержат меньшее количество повторений.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 for (int i = 0; i < pointList.Length; i++)
     pointList[i].Color = Color.Red;
 
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
        PrimitiveType.LineStrip, // тип примитива для отрисовки
        pointList, // массив точек
        0, // смещение, добавляемое для каждого индекса в индексном буфере
        8,  // количество вершин для отрисовки
        lineStripIndices, // массив индесов (последовательность точек)
        0,  // первый используемый индекс
        7); // количество примитивов (линий)
 
for (int i = 0; i < pointList.Length; i++)
    pointList[i].Color = Color.White;

 


В этом примере мы сначала устанавливаем цвет точек в красный и затем рисуем, после чего меняем цвет точек обратно.  Ленты рисуются красным цветом, а списки цветом по умолчанию – белым.

Рисуем треугольники

1. Создаем новый массив индексов, в котором будет пронумерованный список треугольников, по 3 вершины на один треугольник. Массив вершин не меняем.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
triangleListIndices = new short[(width - 1) * (height - 1) * 6];
 
for (int x = 0; x < width - 1; x++)
{
    for (int y = 0; y < height - 1; y++)
    {
        triangleListIndices[(x + y * (width - 1)) * 6] = (short)(2 * x);
        triangleListIndices[(x + y * (width - 1)) * 6 + 1] = (short)(2 * x + 1);
        triangleListIndices[(x + y * (width - 1)) * 6 + 2] = (short)(2 * x + 2);
 
        triangleListIndices[(x + y * (width - 1)) * 6 + 3] = (short)(2 * x + 2);
        triangleListIndices[(x + y * (width - 1)) * 6 + 4] = (short)(2 * x + 1);
        triangleListIndices[(x + y * (width - 1)) * 6 + 5] = (short)(2 * x + 3);
    }
}

 



Этот код индексирует вершины так что каждые 3 точки у нас образуют один треугольник, причем в каждом треугольнике есть общие вершины с соседним. Ниже аналог этого кода –

triangleListIndices = new short[18]{ 0, 1, 2, 2, 1, 3, 2, 3, 4, 4, 3, 5, 4, 5, 6, 6, 5, 7 };

2. Выводим список треугольников на экран используя функцию GraphicsDevice.DrawUserIndexedPrimitives (..) которая в качестве первого аргумента принимает тип выводимого примитива - PrimitiveType.TriangleList

1
2
3
4
5
6
7
8
9
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
        PrimitiveType.TriangleList, // тип примитива для отрисовки
        pointList, // массив точек
        0,   // смещение, добавляемое для каждого индекса в индексном буфере
        8,   // количество вершин для отрисовки
        triangleListIndices,  // массив индесов
        0,   // первый используемый индекс
        6);  // количество примитивов (треугольников)
 

 



Рисуем ленту из треугольников (TriangleStrip)

1. Для ленты из треугольников мы так же используем наш старый массив вершин но создаем новый массив индексов в котором будут последовательно соеденены точки в треугольники.

1
2
3
4
5
6
7
8
   // массив индексов для треугольников
   triangleStripIndices = new short[points];
 
   // заполняем индексы
   for (int i = 0; i < points; i++)
   {
       triangleStripIndices[i] = (short)i;
   }

 



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

Аналог кода создания индексов –

triangleStripIndices = new short[8]{ 0, 1, 2, 3, 4, 5, 6, 7 };

2. Выводим ленту треугольников на экран используя функцию GraphicsDevice.DrawUserIndexedPrimitives (..) которая в качестве первого аргумента принимает тип выводимого примитива - PrimitiveType.TriangleStrip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 0; i < pointList.Length; i++)
     pointList[i].Color = Color.Red;
 
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
        PrimitiveType.TriangleStrip, // тип примитива для отрисовки
        pointList, // массив точек
        0, // смещение, добавляемое для каждого индекса в индексном буфере
        8,  // количество вершин для отрисовки
        triangleStripIndices, // массив индесов
        0,  // первый используемый индекс
        6);  // количество примитивов (треугольников)
 
for (int i = 0; i < pointList.Length; i++)
     pointList[i].Color = Color.White;
 

 



В этом коде мы так же с начала меняем цвет вершин перед отрисовкой.

В заключение приведем схему индексации различных примитивов (еще называют топологией примитивов)



1401 Прочтений •  [Урок 8. Как рисовать точки, линии и другие 3D примитивы] [08.08.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Урок 8. Как рисовать точки, линии и... Ukraine Vova 08.08.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка