Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Урок 6. Как создавать и использовать индексы для рисования сложных 3D объектов
Создание и использование индексов для рисования сложных 3D-объектов. За основу взят проект из урока "Как создавать и использовать матрицы трансформации".

Шаг 1. Начнём с изменения тех методов которые уже использовались в нашем проекте - облегчим методыLoadContent() и Draw() путём переноса из них части кода в отдельные методы. Начнём с метода LoadContent(): уберём из него весь код создания вершин и загрузки шейдера, а на его место вставим код вызова методов СreateVertexList(),СreateIndexList() и СreateEffect() в которых и будут создаваться вершины, индексы и шейдер. Данные методы мы реализуем чуть позже.
1
2
3
4
5
6
7
8
9
10
11
12
13
protected override void LoadContent()
{
СreateVertexList(); // создать вершины
СreateIndexList(); // создать индексы

// создать объект Effect используя контент менеджер
effect = Content.Load<Effect>("Effect");

 
// создать описание формата вершин
vertexDeclaration = new VertexDeclaration(
graphics.GraphicsDevice,
VertexPositionColor.VertexElements);
}

 

Шаг 2. Из метода Draw() уберём весь код рисования 3D-объекта и вставим на его место вызов метода DrawCube()который после реализации будет рисовать куб.
1
2
3
4
5
6
7
8
9
10
11
protected override void Draw(GameTime gameTime)
{
// отчистка экрана в синий цвет
graphics.GraphicsDevice.Clear(Color.Blue);
 
// нарисовать куб
DrawCube();
 
// вывод сцены на экран
base.Draw(gameTime);
}

 

Шаг 3. Добавим в класс Program новое поле indexList которое будет массивом индексов.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Program : Game
{
// графический компонент
GraphicsDeviceManager graphics;
 
// массив вершин
VertexPositionColor[] vertexList;
 
// массив индексов
int[] indexList;
 
// описание формата вершин
VertexDeclaration vertexDeclaration;
 
// эффект (шейдер)
Effect effect;
 
// счетчик времени
float time;

 

Шаг 4. Начнём создавать и реализовывать новые методы в классе Programm. Первым будет метод СreateVertexList() в котором мы должны написать код создания массива вершин. Этот код очень похож на тот что был у наc раньше в методе LoadContent(), но отличается от него тем, что вместо 3-х вершин описывающих углы треугольника мы создаём 8 вершин описывающик углы куба.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
/// создание и заполнение массива вершин
/// </summary>
private void СreateVertexList()
{
// создать массив-контейнер для хранения трёх вершин
vertexList = new VertexPositionColor[8];
 
// верхний набот вершин
vertexList[0] = new VertexPositionColor(new Vector3(-1.0f, -1.0f, 1.0f), Color.Yellow);
vertexList[1] = new VertexPositionColor(new Vector3(1.0f, -1.0f, 1.0f), Color.Red);
vertexList[2] = new VertexPositionColor(new Vector3(-1.0f, -1.0f, -1.0f), Color.Red);
vertexList[3] = new VertexPositionColor(new Vector3(1.0f, -1.0f, -1.0f), Color.Yellow);
 
// нижний набор вершин
vertexList[4] = new VertexPositionColor(new Vector3(-1.0f, 1.0f, 1.0f), Color.Red);
vertexList[5] = new VertexPositionColor(new Vector3(1.0f, 1.0f, 1.0f), Color.Yellow);
vertexList[6] = new VertexPositionColor(new Vector3(-1.0f, 1.0f, -1.0f), Color.Yellow);
vertexList[7] = new VertexPositionColor(new Vector3(1.0f, 1.0f, -1.0f), Color.Red);
}

 

Шаг 5. Создадим метод СreateIndexList(). Данный метод должен позаботиться о создании массива индексов. Каждые 3 индекса в массиве индексов ссылаются на 3 вершины в массиве вершин тем самым описывают 3 угла треугольника. Пара треугольников, или 6 индексов составляют грань куба.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <summary>
/// создание и заполнение массива индексов
/// </summary>
private void СreateIndexList()
{
// создаём массив для 36 индексов
indexList = new int[36];
 
// пара треугольников нижней грани куба
indexList[0] = 3; indexList[1] = 1; indexList[2] = 0;
indexList[3] = 2; indexList[4] = 3; indexList[5] = 0;
 
// пара треугольников верхней грани куба
indexList[6] = 4; indexList[7] = 5; indexList[8] = 7;
indexList[9] = 7; indexList[10] = 6; indexList[11] = 4;
 
// пара треугольников левой грани куба
indexList[12] = 4; indexList[13] = 2; indexList[14] = 0;
indexList[15] = 2; indexList[16] = 4; indexList[17] = 6;
 
// пара треугольников передней грани куба
indexList[18] = 6; indexList[19] = 3; indexList[20] = 2;
indexList[21] = 3; indexList[22] = 6; indexList[23] = 7;
 
// пара треугольников правой грани куба
indexList[24] = 1; indexList[25] = 3; indexList[26] = 7;
indexList[27] = 7; indexList[28] = 5; indexList[29] = 1;
 
// пара треугольников задней грани куба
indexList[30] = 0; indexList[31] = 1; indexList[32] = 5;
indexList[33] = 5; indexList[34] = 4; indexList[35] = 0;
}

 

Шаг 6. Создадим метод DrawCube() и вставим в него код который мы вырезали из метода Draw().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// <summary>
/// рендеринг куба
/// </summary>
void DrawCube()
{
// использовать для отрисовки эффект BasicEffect
effect.Begin();
 
// начать отрисовку первого прохода
effect.CurrentTechnique.Passes[0].Begin();
 
// указать описание формата вершин
graphics.GraphicsDevice.VertexDeclaration = vertexDeclaration;
 
// отключить отсечение невидимых поверхностей
graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;
 
// нарисовать треугольник используя массив вершин
graphics.GraphicsDevice.DrawUserPrimitives
(PrimitiveType.TriangleList, vertexList, 0, 1);
 
// завершить первый проход
effect.CurrentTechnique.Passes[0].End();
 
// завершить использование эффекта BasicEffect
effect.End();
}

 

Шаг 7. Заменим вызов метода graphics.GraphicsDevice.DrawUserPrimitives() на вызов методаgraphics.GraphicsDevice.DrawUserIndexedPrimitives(). Второй метод отличается от первого тем, что он рисует индексированные примитивы, т.е. кроме массива вершин использует массив индексов.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// <summary>
/// рендеринг куба
/// </summary>
void DrawCube()
{
// использовать для отрисовки эффект BasicEffect
effect.Begin();
 
// начать отрисовку первого прохода
effect.CurrentTechnique.Passes[0].Begin();
 
// указать описание формата вершин
graphics.GraphicsDevice.VertexDeclaration = vertexDeclaration;
 
// отключить отсечение невидимых поверхностей
graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;
 

// нарисовать куб используя массив вершин и индексов
graphics.GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
PrimitiveType.TriangleList, // тип примитивов
vertexList, // массив вершин
0, // позиция первой используемой вершины
8, // кол-во используемых вершин
indexList, // массив индексов
0, // позиция первого используемого индекса
12); // кол-во выводимых примитивов
 
// завершить первый проход
effect.CurrentTechnique.Passes[0].End();
 
// завершить использование эффекта BasicEffect
effect.End();
}

 

Итак мы нарисовали куб состоящий из 12 треугольников, но вместо 36 вершин (по 3 на треугольник) мы создали только 8 (описывающих углы куба) и с помощью индексов мы из 8 вершин собрали 12 треугольников. Теперь при запуске приложения вы увидите окно в котором будет "летать" цветной куб.

В секции загрузок лежит архив с исходным кодом этого и других уроков.


Комментарии
#1 | egorduk 23.11.2011 00:27:07
Как это будет на 4.0?
#2 | general 23.11.2011 11:46:44
изменятся 3 строчки
#3 | CTAPbIu_KODEP 17.04.2012 22:20:49
gneral
А по подробнее можно?Smile
#4 | general 18.04.2012 01:14:10
#5 | CTAPbIu_KODEP 18.04.2012 18:12:47
gneral
спасибо =)
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Отлично! Отлично! 100% [3 Голоса]
Очень хорошо Очень хорошо 0% [Нет голосов]
Хорошо Хорошо 0% [Нет голосов]
Удовлетворительно Удовлетворительно 0% [Нет голосов]
Плохо Плохо 0% [Нет голосов]
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,07 секунд 8,709,861 уникальных посетителей