Работа с 3D-моделями в 3D max

Разработка программы на платформе Microsoft Vusial С#, реализующая ряд задач: реализация движения 3D-модели и освещения сцены, изменение вида камеры с третьего на первый и обратно при помощи клавиатуры, запись работы с моделью в видео файл фомата *.avi.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 07.07.2012
Размер файла 407,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Оглавление

1. Введение

2. Обзор методов решения задачи

3. Разработка общей архитектуры модели

4. Разработка модели движения 3D модели

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

4.2. Преобразование в трехмерном пространстве

5. Разработка модели освещения 3D сцены

6. Программная реализация системы моделирования движения 3D объекта

7. Пример использования разработанной системы

8. Заключение

9. Список литературы

1. Введение

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

2. Обзор методов решения задач

Задача состоит в возможности работать с 3D-моделями на 3D-сцене. Для этого в Microsoft Vusial C# приходится добавлять специальные библиотеки, платформы специально разработанные для этих действий, чтобы упростить работу в самой среде. Самые распространенные в данные момент это три платформы OpenGL, XNA Game Studio и WPF(Windows Presentation Foundation) . OpenGL (Open Graphics Library -- открытая графическая библиотека, графическое API) -- спецификация, определяющая независимый от языка прораммирования платформонезависимый программный интерфейс для написания приложений, использующих двухмерную и трёхмерную компьютерную графику. На базовом уровне, OpenGL -- это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации -- библиотеки функций, соответствующих набору функций спецификации. Реализация использует возможности оборудования там, где это возможно. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Производители должны пройти специфические тесты (conformance tests -- тесты на соответствие) прежде чем реализация будет классифицирована как OpenGL реализация. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения. Windows Presentation Foundation (WPF) -- система для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем, графическая (презентационная) подсистема в составе .NET Framework (начиная с версии 3.0), использующая язык XAML. Microsoft XNA (англ. XNA's Not Acronymed) -- набор инструментов с управляемой средой времени выполнения (.NET), созданный Microsoft, облегчающий разработку и управление компьютерными играми. XNA стремится освободить разработку игр от написания «повторяющегося шаблонного кода» и объединить различные аспекты разработки игр в одной системе. Набор инструментов XNA был анонсирован 24 марта 2004 на Game Developers Conference в Сан-Хосе, Калифорния. Первый Community Technology Preview XNA Build был выпущен 14 марта 2006.

Первая платформа наиболее древняя из трех представленных и больше разрабатывалась под С++. Сравнивая две оставшиеся платформы я пришел к выводу, что XNA Studio более удобен в по ряду причин. В плане возможностей работы с 3D-моделями, легкости нахождения информации.

3. Разработка общей архитектуры системы

Логически архитектуру данной системы можно представить в виде:

Рис.1. Логически простроенная архитектура системы

Как видно все можно разделить на три логических блока. В первом производится прием данных от пользователя. После следует вычисления относительно вводимых данных. И последний блок это построение сцены относительно вычислений. Для данного проекта все три блока зациклены, чтобы иметь возможность в любой момент времени реагировать на данные которые мы вводим.

Если раскрывать все блоки, то мы получим архитектуру нашего проекта (Табл. 1).

Таблица 1. Архитектура проекта

Инициализация

На этапе инициализации проекта проводится инициализация графической и звуковых подсистем, системы ввода данных.

Загрузка ресурсов

Здесь загружаются ресурсы, такие, как текстуры и трехмерные модели, звуки, шрифты.

Начало цикла

Основные действия, которые выполняются при работе программы, организованы в виде цикла. Фактически, цикл - это обязательный элемент любой программы с 3д-моделями.

Считывание данных пользовательского ввода

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

Вычисления

Вычисления включают в себя все вычисления, которые необходимы для организации процесса. В частности, здесь обсчитываются позиции объектов, проводятся вычисления, вычисления, связанные с проверкой столкновений объектов и так далее. Если речь идет об оптимизации быстродействия программы, то такая оптимизация обычно касается именно вычислений, так как на них тратится большая часть времени выполнения цикла.

Проверка критерия прекращения программы

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

Вывод изображений, проигрывание звуков

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

Конец цикла

Цикл заканчивается после выполнения условия останова программы.

Освобождение ресурсов

На последнем этапе работы программы проводится освобождение системных ресурсов, занятых программой и выход из ее.

В программе раннее описанную архитектуру представляют ряд методов.

Game1() - Общая инициализация. Game1() - это конструктор класса Game1, который выполняется при создании объекта Game в процедуре Main файла Program.cs.

Initialize() - Инициализация. Сюда же добавляют команды для инициализации звуковой подсистемы игры. Надо отметить, что в этом методе инициализируется все, кроме графических ресурсов игры

LoadContent() - Загрузка ресурсов.

Run() - Запуск цикла.

Цикл в стандартном проекте состоит из двух методов.

Update() - Первый из них - это метод Update(), в котором выполняется прием пользовательского ввода, все необходимые вычисления, проверка критериев останова программы.

Draw() - Второй метод цикла - это метод Draw(), который содержит код для визуализации графики.

UnloadContent() - По окончании цикла этот метод освобождает системные ресурсы.

С помощью этих стандартных методов работа с моделирование упрощается достаточно существенно. Теперь осталось разработать модели обеспечивающие поставленную задачу.

4. Разработка модели движения 3D объекта

Понятие 3D подразумевает под собой систему координат. И поэтому чтобы разработать модель движения изначально надо разобрать систему координат которая используется в программе. И после разберем метод который отвечает за движения который называется «Преобразование в трехмерном пространстве».

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

При работе с трехмерной графикой используется несколько видов систем координат. Для отображения двумерных объектов нам была нужна соответствующая система координат с двумя осями - горизонтальной осью X и вертикальной осью Y. Напомним, что экранная система координат для двумерной графики имеет начало (точку 0,0) в левом верхнем углу монитора, положительная часть оси X располагается справа от начала координат, положительная часть оси Y - снизу.

Для работы с трехмерными объектами нам понадобится еще одна ось - она называется ось Z. Существует несколько вариантов трехмерных систем координат, в частности, распространены так называемые правосторонняя и левосторонняя системы. Мы будем пользоваться правосторонней системой - она применяется в XNA Framework. Её схематичное изображение приведено на рис. 2

Рис. 2. Правосторонняя система координат

Особенность этой системы координат заключается в том, что начало координат можно сопоставить с левым нижним углом монитора, положительная часть оси X находится справа от начала координат, положительная часть оси Y - сверху, а положительная часть оси Z - спереди. А это значит, что видимая часть оси Z - это её отрицательная часть. Эта часть оси находится как бы «в глубине монитора», в то время, как положительная часть находится «спереди монитора». На рис. 2. пунктиром изображена отрицательная часть оси Z.

В двумерной системе координат существует понятие точки - ее координаты задаются двумя значениями - X и Y. Точки существуют и в трехмерной системе координат - они задаются уже тремя значениями - X, Y, Z.

Точки используют для того, чтобы задавать координаты вершин многоугольников (полигонов), в частности - треугольников. Так, треугольник, изображенный на рис. 2., задан тремя точками - A, B, C.

Как правило, более сложные трехмерные объекты строятся именно из треугольников.

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

Чем больше треугольников использовано при построении модели - тем более детализированной она получается. Точки, соответствующие вершинам треугольника, который можно изобразить в трехмерном пространстве, называются вершинами. Работая с трехмерной графикой в XNA вам часто придется встречать английский вариант слова вершина - vertex. Возможно, вам встретится множественное число слова вершина: «вершины» выглядит по-английски как «vertices». Иногда для обозначения вершин используют кальку с английского - вертекс.

Треугольник не случайно выбран в качестве базовой геометрической фигуры - во-первых - этот многоугольник всегда является выпуклым, во-вторых - невозможно расположить три точки таким образом, чтобы они не принадлежали одной плоскости. То есть, треугольник - это фигура, которая всегда является выпуклой и плоской, что позволяет с успехом использовать его в целях трехмерной графики.

Несколько граней, из которых состоит трехмерный объект, называются сеткой (mesh). "Сетка" представляет собой набор треугольников.

Еще одно понятие, которое пригодится вам при работе с трехмерной графикой - это понятие вектора. Вектор (vector), так же как и точка, может быть определен тремя параметрами, однако он описывает не положение в пространстве, а направление и скорость движения.

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

Например, вектор с координатами (1,0,0) означает: «направление - вправо, скорость - 1». Если отложить этот вектор от начала координат, то хорошо видно, что он направлен именно вправо (рис. 3.).

Направление вектора определяется положением второй точки относительно первой (в нашем случае - положение точки конца вектора, которой задается вектор относительно начала координат), а скорость - длиной вектора - то есть - разницей между начальной и конечной точкой. В нашем случае длина вектора совпадает с координатами его конца.


Рис. 3. Вектор (1,0,0)

Существует особый вид векторов - нормали (normals). Нормали могут быть построены для граней и для вершин объекта. Нормали для граней перпендикулярны этим граням. Они используются при расчете цвета объекта.

4.2 Преобразования в трехмерном пространстве

Зная координаты вершин полигонов, из которых состоит объект, мы можем расположить его в пространстве. Теперь нужно разобраться с изменением положения объектов в пространстве. Существует несколько основных операций, которые могут использоваться для перемещения объектов в трехмерном пространстве. Это - перемещение (translation), вращение (rotation) и масштабирование (scale).

Результаты работы графической подсистемы трехмерной игры мы видим на плоском экране монитора - смоделированная компьютером трехмерная сцена проецируется на двумерную поверхность. При проецировании нужно выбрать точку, которая выполняет роль камеры, позволяющей видеть трехмерное пространство. В свою очередь, объекты в трехмерном пространстве могут перемещаться в соответствии с определенными правилами. Для управления всем этим используются несколько матриц. Это - мировая матрица (World Matrix), матрица вида (View Matrix) и матрица проекции (Projection Matrix).

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

Мировая матрица позволяет задавать преобразования - перемещения, вращения и трансформации объектов.

Матрица вида позволяет управлять камерой.

Матрица проекции служит для настройки проекции трехмерной сцены на экран.

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

Таблица 2. Вершины треугольника до перемещения

Вершина

X

Y

Z

1

20

10

5

2

15

20

10

3

25

30

10

При перемещении этого треугольника на 10 позиций по оси X мы должны прибавить по 10 к каждой из координат X его вершин. В результате получится матрица такого вида (табл. 3.).

Таблица 3. Вершины треугольника после перемещения

Вершина

X

Y

Z

1

30

10

5

2

25

20

10

3

35

30

10

Того же эффекта можно достичь, умножив координаты каждой из вершин на мировую матрицу. Для этого координаты вершины представляют в виде матрицы, состоящей из одной строки и четырех столбцов. В первых трех столбцах содержатся координаты X, Y, Z, в четвертом - 1. Мировая матрица представлена в виде таблицы 4х4. Вот как выглядит операция умножения матриц (формула 1.):

Формула 1. Умножение матрицы вершины и мировой матрицы

При преобразовании каждая из вершин умножается на мировую матрицу.

Каждое из преобразований в пространстве требует особой настройки мировой матрицы. В формуле 2. приведен шаблон мировой матрицы, которая позволяет перемещать объекты в пространстве.

Формула 2. Мировая матрица для перемещения объекта


Здесь ДX ,ДY и ДZ - это приращения координат X, Y и Z.
Мировая матрица для вращения объектов вокруг оси Х выглядит так (формула 3.).

Формула 3. Мировая матрица для вращения по оси

Здесь б - угол поворота в радианах

Мировая матрица для вращения объектов по оси Y выглядит так (формула 4.)

Формула 4. Мировая матрица для вращения по оси

Матрица для вращения объектов вокруг оси Z приведена в формуле 5.

Формула 5. Мировая матрица для вращения по оси Z


Формула 6. представляет матрицу, которая служит для трансформации объектов.

цx, цy ,цz - это коэффициенты масштабирования, которые применяются к вершинам. Они позволяют «сжимать» или «растягивать» объекты.

Другие типы матриц:

Матрица вида влияет на положение камеры - точки, из которой осуществляется просмотр трехмерной сцены.

Матрица проекции позволяет управлять проецированием сцены на экран. В XNA существует два вида проекций.

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

Второй вид проекции - это ортогональная проекция. Здесь объекты проецируются на плоскость экрана без учета перспективы.

5. Разработка модели освещения 3D сцены

Рассмотрим управление освещением и отображением теней в XNA. Существуют различные техники работы с тенями, мы рассмотрим отрисовку теней с использованием так называемого буфера трафаретов, или, по-английски - Stencil Buffer.

Stencil Buffer является стандартным устройством, входящим в состав современных видеокарт. Однако, различные видеокарты могут иметь различный размер этого буфера, поэтому, перед его использованием, необходимо определить, какой именно буфер доступен на видеокарте, используемой в данный момент.

Для создания тени мы воспользуемся методом CreateShadow объекта Matrix. Он позволяет создавать тень от объекта на основе информации об источнике освещения и плоскости, на которую должна проецироваться тень.

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

В этой программе так же разработаем перемещением источника света. В частности, мы применим для рисования объектов один направленный источник света, направление которого можно менять с помощью клавиш клавиатуры - координата Z изменяется с помощью клавиш-Z и X, координата X - С и V, координата Y - B и N. Изменение направления освещения влияет не только на освещение объектов, но и на тень.

6. Программная реализация системы моделирования движения 3D объекта modCls, который будет отвечать за хранение параметров, соответствующих этим объектам и за их визуализацию

public class modCls : Microsoft.Xna.Framework.DrawableGameComponent

{

//Модель

public Model myModel;

//Мировая матрица, матрицы вида и проекции

publicMatrix WorldMatrix;

publicMatrix ViewMatrix;

publicMatrix ProjectMatrix;

//Направление света

public Vector3 LightDirection;

//Матрица для отображения тени

Matrix shadow;

//Плоскость, на которой отображается тень

Plane sPlane;

//Соотношение сторон экрана

publicfloat aspectRatio;

//Для управления графическим устройством

GraphicsDeviceManager graphics;

//Конструктор получает на вход

//игровой класс, модель, объект для управления графическим устройством

public modCls(Game game, Model mod, GraphicsDeviceManager grf, Plane pl)

base(game)

{

myModel = mod;

graphics = grf;

sPlane = pl;

aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /

(float)graphics.GraphicsDevice.Viewport.Height;

LightDirection = new Vector3();

}

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

public override void Draw(GameTime gameTime)

{

//Выводим объект

foreach (ModelMesh mesh in myModel.Meshes)

{

//Для каждого эффекта в сети

foreach (BasicEffecteffect in mesh.Effects)

{

//Включить источник направленного света №0

effect.DirectionalLight0.Enabled = true;

//Настроить параметры

effect.DirectionalLight0.DiffuseColor = Vector3.One;

effect.DirectionalLight0.SpecularColor = Vector3.One;

//Направление света - в класса Game1 мы меняем направление

//по клавиатурным командам

effect.DirectionalLight0.Direction = Vector3.Normalize(LightDirection);

effect.LightingEnabled = true;

//установить матрицы

effect.World = WorldMatrix;

effect.View = ViewMatrix;

effect.Projection = ProjectMatrix;

}

mesh.Draw();

}

//Создать матрицу тени

shadow = Matrix.CreateShadow(-LightDirection, sPlane);

graphics.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

graphics.GraphicsDevice.BlendState = BlendState.Opaque;

//Выводим тень

foreach (ModelMesh mesh in myModel.Meshes)

{

foreach (BasicEffecteffect in mesh.Effects)

{

effect.AmbientLightColor = Vector3.Zero;

effect.Alpha = 0.5f;

effect.DirectionalLight0.Enabled = false;

effect.DirectionalLight1.Enabled = false;

effect.DirectionalLight2.Enabled = false;

effect.View = ViewMatrix;

effect.Projection = ProjectMatrix;

//При выводе тени умножаем мировую матрицу

//на матрицу вывода тени

effect.World = WorldMatrix*shadow;

}

mesh.Draw();

}

base.Draw(gameTime);

}

После объявляем список переменных которые будет использоваться в проекте.

GraphicsDeviceManager graphics;

//Матрицы

Matrix viewMatrix;

Matrix projMatrix;

const int shadowMapWidthHeight = 2048;

//Модели

Model ball, cube, ball2;

// Позиция объекта, поворот

Vector3avatarPosition = new Vector3(0, -1f, -50);

float avatarlRotation;

//Массив моделей сцены

modCls[] cls;

//Игровой объект

modCls ballObj;

//Плоскость

modCls plane;

//Направление света

Vector3 LightDirection;

BoundingFrustum cameraFrustum = new BoundingFrustum(Matrix.Identity);

// Положение камеры

Vector3 cameraReference = new Vector3(0, 0, 10);

Vector3 thirdPersonReference = new Vector3(0, 200, -200);

// Скорости поворота и движения

float rotationSpeed = 1f / 60f;

float forwardSpeed = 50f / 60f;

//Поле зрения камеры

float viewAngle = MathHelper.ToRadians(45.0f);

//Расстояние от камеры до переднего и заднего плана

float nearClip = 1.0f;

float farClip = 2000.0f;

// Установка позиции камеры 2 - вид от третьего лица

//1 - от первого лица

int cameraState = 2;

//Соотношение сторон экрана

float aspectRatio;

Загружаем модели которые мы будем использовать в проекте. Создаем базу для хранения этих моделей.

protected override void LoadContent()

{

//Загрузка моделей

ball = Content.Load<Model>("ball");

cube = Content.Load<Model>("cube");

ball2 = Content.Load<Model>("ball2");

aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /

(float)graphics.GraphicsDevice.Viewport.Height;

cls = new modCls[75];

LightDirection = new Vector3(80, -136, 80);

}

Метод отвечающий за изменения положения источника света. За изменения по оси Z отвечают клавиши Z и X(первая уменьшает позицию, вторая увеличивает), ось X- C и V, ось Y- B и N.

//Изменение позиции источника света

void LightSourceControl()

{

//Получим состояние клавиатуры

KeyboardState key = Keyboard.GetState();

//Клавиша z - уменьшим позицию по Z

if (key.IsKeyDown(Keys.Z))

{

LightDirection.Z -= 0.5f;

}

//Клавиша x - увеличим Z

if (key.IsKeyDown(Keys.X))

{

LightDirection.Z += 0.5f;

}

//c - уменьшим X

if (key.IsKeyDown(Keys.C))

{

LightDirection.X -= 0.5f;

}

//"v" - увеличим X

if (key.IsKeyDown(Keys.V))

{

LightDirection.X += 0.5f;

}

//"b" - увеличим Y

if (key.IsKeyDown(Keys.B))

{

LightDirection.Y += 0.5f;

}

//"n" - уменьшим Y

if (key.IsKeyDown(Keys.N))

{

LightDirection.Y -= 0.5f;

}

//Выведем в заголовок окна информацию о направлении

this.Window.Title = "Light source: " + LightDirection.ToString();

}

За движения объекта отвечает класс UpdateAvatarPosition(). Управление производится стрелками клавиатуры. При нажатие на клавишу вперед или назад производится соответствующие движения. А при нажатие клавиш влево или вправо происходит соответствующий поворот относительно оси Y.

//Обновляем состояние объекта

void UpdateAvatarPosition()

{

KeyboardState keyboardState = Keyboard.GetState();

//Поворот влево

if (keyboardState.IsKeyDown(Keys.Left))

{

avatarlRotation += rotationSpeed;

}

//Поворот вправо

if (keyboardState.IsKeyDown(Keys.Right))

{

avatarlRotation -= rotationSpeed;

}

//Движение вперед

if (keyboardState.IsKeyDown(Keys.Up))

{

Matrix forwardMovement = Matrix.CreateRotationY(avatarlRotation);

Vector3 v = new Vector3(0, 0, forwardSpeed);

v = Vector3.Transform(v, forwardMovement);

avatarPosition.Z += v.Z;

avatarPosition.X += v.X;

while (IsCollide())

{

avatarPosition.Z -= v.Z;

avatarPosition.X -= v.X;

}

}

//Движение назад

if (keyboardState.IsKeyDown(Keys.Down))

{

Matrix forwardMovement = Matrix.CreateRotationY(avatarlRotation);

Vector3 v = new Vector3(0, 0, -forwardSpeed);

v = Vector3.Transform(v, forwardMovement);

avatarPosition.Z += v.Z;

avatarPosition.X += v.X;

while (IsCollide())

{

avatarPosition.Z -= v.Z;

avatarPosition.X -= v.X;

}

}

//Уменьшение угла обзора камеры

if (keyboardState.IsKeyDown(Keys.R))

{

viewAngle -= MathHelper.ToRadians(1.0f);

}

//Увеличение угла обзора камеры

if (keyboardState.IsKeyDown(Keys.F))

{

viewAngle += MathHelper.ToRadians(1.0f);

}

//Если новый угол обзора вышел за дозволенные пределы

//изменяем его

if (viewAngle > MathHelper.ToRadians(180.0f)) viewAngle = MathHelper.ToRadians(179.9f);

if (viewAngle < MathHelper.ToRadians(0.9f)) viewAngle = MathHelper.ToRadians(1f);

// Выход из программы при нажатие Esc.

if (keyboardState.IsKeyDown(Keys.Escape))

{

Exit();

}

}

Создаем булевую функцию отвечающие за проверку столкновений объектов.

bool IsCollide()

{

//Для объекта BoundingSphere, соответствующего

//текущему объекту сцены

BoundingSphere b1;

//Получить BoundingSphere для игрового объекта

BoundingSphere b = ball.Meshes[0].BoundingSphere;

//Установить центр сферы в соответствии с положением

//игрового объекта

b.Center =avatarPosition;

//Переменная для хранения вектора размера модели

Vector3 scale;

//Переменная для хранения информации о повороте модели

Quaternion rotation;

//Переменая для хранения информации о позиции модели

Vector3 translation;

//Цикл обхода объектов сцены

for (int i = 0; i < 75; i++)

{

//Получить BoundingBox для текущего объекта

b1 =cls[i].myModel.Meshes[0].BoundingSphere;

//Получить параметры - размер, поворот, позицию для объекта

cls[i].WorldMatrix.Decompose(out scale, out rotation, out translation);

//Установить соответствии с позицией объекта

b1.Center = translation;

//Если сферы игрового объекта и текущего объекта

if (b1.Intersects(b))

{

//Возвратим True

return true;

}

} //Если выполняется этот код -

//столкновения не было

//и вернем false

return false;

}

Последний метод отвечающий за построение самой сцены и самого объекта

//Вывод объектов сцены

void DrawScene()

{

Components.Clear();

int i = 0;

//Она немного выше плоскости, которую мы выводим на экран

//для того, чтобы тень была видна

Plane pl1 = new Plane(new Vector3(0, -2f, 0), new Vector3(2, -2f, 1), new Vector3(-1, -2f, -2));

//Вывести кубы, расположенные в пять рядов

//по пять штук в трех уровнях

for (int x = 0; x < 5; x++)

{

for (int y = 0; y < 3; y++)

{

for (int z = 0; z < 5; z++)

{

//Добавляем в массив новый объект

cls[i] = new modCls(this, ball2, graphics, pl1);

//Устанавливаем его свойства

cls[i].WorldMatrix = Matrix.CreateTranslation(x * 40, y*3, z * 40);

cls[i].ViewMatrix = viewMatrix;

cls[i].ProjectMatrix = projMatrix;

cls[i].LightDirection = LightDirection;

//Добавляем в коллекцию компонентов

Components .Add (cls[i]);

i++;

}

}

}

ballObj = new modCls(this, ball, graphics, pl1);

ballObj.WorldMatrix = Matrix.CreateRotationY(avatarlRotation) * Matrix.CreateTranslation(avatarPosition);

ballObj.ViewMatrix = viewMatrix;

ballObj.ProjectMatrix = projMatrix;

ballObj.LightDirection = LightDirection;

Components.Add(ballObj);

plane = new modCls(this, Content.Load<Model>("plane"), graphics, new Plane());

//Настраиваем параметры плоскости

plane.WorldMatrix = Matrix.CreateScale(100) * Matrix.CreateRotationY(MathHelper.ToRadians(90)) *

Matrix.CreateRotationZ(MathHelper.ToRadians(90)) *

Matrix.CreateTranslation(80, -2.5f, 80);

plane.ViewMatrix = viewMatrix;

plane.ProjectMatrix = projMatrix;

plane.LightDirection = LightDirection;

Components.Add(plane);

}

}

}

7. Пример использования разработанной системы.

Рис.4. Запуск программы

Рис.5. Изменения освещения сцены, местоположения объекта

Рис.6. Изменения вида камеры

8. Заключение

Были приобретены умения по работе с 3D моделями в 3D max'е и загрузка, с последующей работой, созданной модели в XNA Studio.

Была разработана программа, на платформе Microsoft Vusial С#, реализующая ряд задач. Первая и основная это реализация движения 3D модели. Вторая реализация освещения сцены. Так же изменение вида камеры с третьего на первый и обратно при помощи клавиатуры. Изменения угла обзора камеры, чтобы увидеть больше сцены. И запись всей проделанной работы с моделью в видео файл фомата *.avi.

9. Список литературы

движение модель видео формат

David M. Bourg, Glenn Seeman. AI for Game Developers. - O'Reilly, 2004

Michael Morrison. Teach yourself Game Programming in 24 hours. - Sams Publishing, 2002

Katie Salen, Eric Zimmerman, Rules of Play: Game Design Fundamentals. - MIT Press, 2004

David Franson, 2D Artwork and 3D Modeling for Game Artists. - Premier Press, 2003

Erik Bethke, Game Development and Production - Worldware Publishing, 2003

Горнаков С.Г. Разработка игр под Windows в XNA Game Studio Express. - М.: ДМК Пресс, 2007.

Ламот, Андре. Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации. Пер. с англ. -- М.: Издательский дом «Вильямс», 2004.

Материалы microsoft.com по XNA

1. Размещено на www.allbest.ru


Подобные документы

  • Описание работы программы, осуществляющей запись команд графического экрана в файл формата BMP. Изучение функции чтения 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов. Составление блок-схемы и текста программы.

    курсовая работа [198,1 K], добавлен 20.11.2012

  • Разработка мультимедиа-программы для прослушивания аудио-файлов и просмотров видео. Описание меню для пользователей и для администраторов проекта. Создание форм для указанного приложения при помощи Visual Foxpro 9. Листинг программы и ее результаты.

    курсовая работа [1,9 M], добавлен 27.07.2013

  • Задачи, выполняемые администраторами ИС ФНС РФ по обеспечению сетевой безопасности ОС UNIX. Требования к системе разработки симулятора. Блок распознавания введенной переменной. Реализация симулятора при помощи Adobe Captivate. Запись ошибки в лог-файл.

    курсовая работа [1,0 M], добавлен 01.05.2011

  • Принципы работы Microsoft Project (программы по управлению проектами), ее основные понятия: задачи, ресурсы, назначения. Последовательность действий по созданию нового проекта, вводу задач и зависимостей между ними, вводу ресурсов. Работа с календарями.

    курсовая работа [3,1 M], добавлен 23.01.2011

  • Разработка и практическая апробация программы для соответствия поставленным требованиям: реализация трассировки лучей с просчетом теней, освещения, отражения, преломления лучей, что является несомненным достоинством данной спроектированной программы.

    курсовая работа [662,7 K], добавлен 14.04.2011

  • Блок-схема программы, подсчитывающей количество слов последовательности, начинающихся с большой буквы и оканчивающихся цифрой. Символьный квадратный массив и его заполнение. Создание программы, которая формирует файл записей заданной структуры.

    курсовая работа [529,7 K], добавлен 19.12.2010

  • Создание программного обеспечения и разработка программ автоматизации процессов. Считывание товаров из файла. Группировка товаров по категориям. Вывод на экран всех товаров в заданной категории. Изменение полей товара и запись изменений в файл.

    курсовая работа [312,6 K], добавлен 29.12.2014

  • Назначение пунктов меню Файл программы Paint операционной системы Windows XP. Назначение и состав пункта меню Таблица программы Microsoft Word 2002. Назначение и состав пункта меню Формат программы Microsoft Excel 2002. Назначение и состав вкладки.

    контрольная работа [25,2 K], добавлен 22.08.2015

  • Общие сведения о платформе Microsoft NET Framework. Разработка приложения "Поставка и реализация программного обеспечения", содержащего базу данных о каталогах адресов в Internet. Описание логической структуры. Требования к техническому обеспечению.

    курсовая работа [2,4 M], добавлен 28.06.2011

  • Запись в файл и чтение в С++. Общее понятие о структуре. Многомерные и двумерные массивы. Логика работы программы. Схема алгоритма функции Main. Определение суммарного заработка, сотрудника с наибольшей зарплатой. Создание новой базы, листинг программы.

    курсовая работа [275,7 K], добавлен 07.10.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.