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

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

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

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

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

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

 

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

 

public class modCls : Microsoft.Xna.Framework.DrawableGameComponent

{

//МодельModel myModel;

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

publicMatrix WorldMatrix;ViewMatrix;ProjectMatrix;

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

public Vector3 LightDirection;

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

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

Plane sPlane;

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

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

GraphicsDeviceManager graphics;

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

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

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

{

myModel = mod;= grf;= pl;= (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.DirectionalLight0.Enabled = true;

//Настроить параметры.DirectionalLight0.DiffuseColor = Vector3.One;.DirectionalLight0.SpecularColor = Vector3.One;

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

//по клавиатурным командам.DirectionalLight0.Direction = Vector3.Normalize(LightDirection);

.LightingEnabled = true;

 

//установить матрицы.World = WorldMatrix;.View = ViewMatrix;.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)

{.AmbientLightColor = Vector3.Zero;.Alpha = 0.5f;.DirectionalLight0.Enabled = false;.DirectionalLight1.Enabled = false;.DirectionalLight2.Enabled = false;.View = ViewMatrix;.Projection = ProjectMatrix;

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

//на матрицу вывода тени.World = WorldMatrix*shadow;

}

mesh.Draw();

}

base.Draw(gameTime);

}

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

 

GraphicsDeviceManager graphics;

//МатрицыviewMatrix;projMatrix;

const int shadowMapWidthHeight = 2048;

//Модели

Model ball, cube, ball2;

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

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

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

modCls[] cls;

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

modCls ballObj;

//Плоскостьplane;

 

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

Vector3 LightDirection;cameraFrustum = new BoundingFrustum(Matrix.Identity);

 

// Положение камерыcameraReference = new Vector3(0, 0, 10);thirdPersonReference = new Vector3(0, 200, -200);

 

// Скорости поворота и движенияrotationSpeed = 1f / 60f;

 

float forwardSpeed = 50f / 60f;

 

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

float viewAngle = MathHelper.ToRadians(45.0f);

 

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

float nearClip = 1.0f;farClip = 2000.0f;

 

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

//1 - от первого лицаcameraState = 2;

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

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

protected override void LoadContent()

{

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

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

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

("ball2");=(float)graphics.GraphicsDevice.Viewport.Width/">= Content.Load("ball2");= (float)graphics.GraphicsDevice.Viewport.Width /

(float)graphics.GraphicsDevice.Viewport.Height;= new modCls[75];= 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))

{.Z -= 0.5f;

}

//Клавиша x - увеличим Z(key.IsKeyDown(Keys.X))

{

LightDirection.Z += 0.5f;

}

//c - уменьшим X(key.IsKeyDown(Keys.C))

{.X -= 0.5f;

}

//"v" - увеличим X(key.IsKeyDown(Keys.V))

{

LightDirection.X += 0.5f;

}

//"b" - увеличим Y(key.IsKeyDown(Keys.B))

{.Y += 0.5f;

}

//"n" - уменьшим Y(key.IsKeyDown(Keys.N))

{.Y -= 0.5f;

}

 

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

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

}

 

За движения объекта отвечает класс UpdateAvatarPosition(). Управление производится стрелками клавиатуры. При нажати?/p>