Привет всем! На первом уроке по
XNA я расскажу, как грузить в ваш проект 3d модели. Но для начала надо поговорить, как мы будем это делать. Сперва мы создадим экземпляр класса
Model затем в методе
LoadContent загрузим саму модель, чтобы ее увидеть. И в методе
Draw с помощью
BasicEffect выведем ее на экран. Еще расскажу немного о матрицах. Матрицы в
XNA имеют очень важную роль почти что все строится именно на них. Например, при построении тени от объекта надо создать матрицу
CreateShadow или например
CreateBilboard для билборда. Но пока это нам не надо и мы остановимся на трех основных:
World - это матрица, предназначеная для трансформации объекта. При перемещение или маштабирование надо использовать ее. Например что бы оскалить модель в два раза, нужно записать так
Code
Matrix world = Matrix.CreateScale(2); //скалим ее в 2 раза
Так же можно после этого и перемещать ее умножив на матрицу трансформации.
CreatePerpectiveFildOfView - это матрица проекции. Она отображает все трехмерное на экран монитора. В параметрах вы должны указать поле зрение камеры например
45.0f, ближняя и дальняя плоскость отсечение камеры, соотношение сторон монитора
aspectratio и.т.д
CreateLookAt - это сама можно сказать и камера создается при помощи
Matrix view = Matrix.CeateLookAt (позиция камеры,куда направлена камера, и
Vector3.Up) то же самое что
Vector3(0,1,0) )
Ну давайте теперь создадим новы проект
XNA, в
Content дабавьте модель и пишем после объявление класса
Game1 следующее
Code
Model model; //это, как я уже сказал выше, ссылка на вашу модель
Переходим в метод
LoadContent:
Code
model = Content.Load<Model>("путь к файлу"); // у меня он Такой "Models\\house1.x"
Ну пока все нормально,если запустить проект то мы не чего не увидем. А дело в том что ее (модель) надо вывесть на экран. Для этого в методе
Draw пройдемся по мешам каждой модели и выведим их на экран
Code
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();//освещение по умолчанию
effect.World = Matrix.Identity;//модель не двигаем
effect.View = Matrix.CreateLookAt(new Vector3(0, 2, 10), Vector3.Zero, Vector3.Up);//матрица вида
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.5f),//проекции
graphics.GraphicsDevice.Viewport.AspectRatio, 0.1f, 1000);
}
mesh.Draw();
}
Вот собственно и те матрицы о которых я говорил. Если запустите проект то увидите свою модель на экране. Давайте дадим ей немного интерактивности.Пусть модель вращается вокруг оси Y со скоростью 0,.01f. Для этого в тело класса запишем угол поворота
В методе
Update будем увиличивать ее на один. Затем матрицу мира мы умножим на матрицу вращение вокруг оси
Y.
Code
effect.World = Matrix.Identity * Matrix.CreateRotationY(MathHelper.ToRadians(angle));//MathHelper.ToRadians это математическая операция она используется во многих вычислений.
Полный код:
Code
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Lesson_1
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//объявляем модель
Model model;
//угол поворота модели
float angle = 0.01f;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
//грузим в проект
model = Content.Load<Model>("Models\\house1");
}
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
protected override void Update(GameTime gameTime)
{
//при каждом проходе увеличивыаем на 1
angle++;
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.World = Matrix.Identity * Matrix.CreateRotationY(MathHelper.ToRadians(angle));
effect.View = Matrix.CreateLookAt(new Vector3(0, 2, 10), Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.5f),
graphics.GraphicsDevice.Viewport.AspectRatio, 0.1f, 1000);
}
mesh.Draw();
}
base.Draw(gameTime);
}
}
}
Ну в принципе и все. Кстати в реальных играх такой подход естественно не пойдет. Надо создать отдельный класс для загрузки моделей в игровй мир. И еще хотел напомнить формат
x очень удобен так как он экспортирует модель с текстурами скразу и с координатами так же и модель
FBX но по моему она без текстур.