Работа с 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>