Вторник, 26 Ноября 2024, 12:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
XNA Основы3D: Урок 1 "Загрузка модели"
Alexandr2Дата: Среда, 17 Августа 2011, 05:16 | Сообщение # 1
частый гость
Сейчас нет на сайте
привет всем на первом уроке по XNA я расскажу как грузить в ваш проект 3d модели.Но для начало надо поговорить по как мы будем это делать.Сперва мы создадим экземпляр класса Model затем в методе LoadContent загрузим саму модель,что бы ее увидеть в методе Draw с помощью BasicEffect ее выведем на экран.Еще скажу немного о матрицах.Матрицы в XNA имеют очень важную роль почти что все строится именно на них.Например при построении тени от объекта надо создать матрицу CreateShadow или например CreateBilboard для билборда.Но пока это нам не надо и мы остановимся на трех основных:

World - это матрица предназначена для трансформации объекта.Например при перемещение или маштабирование надо использовать ее. Например что бы оскалить модель в два раза нужно записать так Matrix world = Matrix.CreateScale(2); //скалим ее в 2 раза,так же можно после этого и перемещать ее умножив на матрицу трансформации

CreatePerpectiveFildOfView - это матрица проекции.Она отображает все трехмерное на экран монитора. В параметрах вы должны указать поле зрение камеры например 45.0f,блищняя и дальняя плоскость отсечение камеры, соотношение сторон монитора aspectratio и.т.д

CreateLookAt - это сама можно сказать и камера создается при помощи Matrix view = Matrix.CeateLookAt(позиция камеры,куда направлена камера, и Vector3.Up) то же самое что Vector3(0,1,0)

Ну давайте теперь создадим новы проект XNA, в Content дабавьте модель и пишем после объявление класса Game1 следующее

Model model;//это как я уже сказал выше ссылка на вашу модель

Переходим в метод LoadContent:

model = Content.Load<Model>("путь к файлу");// у меня он Такой "Models\\house1.x"

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

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.Для этого в тело класса запишем угол поворота

float angle = 0.01f;

В методе Update будем увиличивать ее на один. Затем матрицу мира мы умножим на матрицу вращение вокруг оси Y.
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 но по мое му она без текстур

скачать плагин для 3d Max PandaDirectX

скачать Xna GameStudio 4.0

скачать VisualExpress c#




Сообщение отредактировал Alexandr2 - Пятница, 19 Августа 2011, 18:03
SlavyanOOsДата: Среда, 17 Августа 2011, 09:09 | Сообщение # 2
Problems, developer?
Сейчас нет на сайте
Оформление никакое, читать неудобно.
Alexandr2Дата: Среда, 17 Августа 2011, 09:13 | Сообщение # 3
частый гость
Сейчас нет на сайте
По-моему все тут понятно, очень даже все просто.А изложил мыcль достаточно. Скриншоты вообще нет смысла выкладывать кто знаком с XNA хотя бы с 2d тому еще легче. Если вы не понимаете может XNA не для вас.



Сообщение отредактировал Alexandr2 - Среда, 17 Августа 2011, 09:47
SlavyanOOsДата: Среда, 17 Августа 2011, 09:39 | Сообщение # 4
Problems, developer?
Сейчас нет на сайте
Да не, выложил бы код тегом, и хотя бы структурировал его. Читалось бы лучше.

Сообщение отредактировал SlavyanOOs - Среда, 17 Августа 2011, 09:39
ЛеонДата: Среда, 17 Августа 2011, 10:22 | Сообщение # 5
почетный гость
Сейчас нет на сайте
и в правду все сливается.Поддерживаю Славика:сделай код тегом!
P.s. пару скринов тоже бы не помешало biggrin
Stalker_ShooterДата: Четверг, 18 Августа 2011, 10:59 | Сообщение # 6
3D XNA'шник
Сейчас нет на сайте


Замени свой первый пост примерно на такой (это так он выглядит визуально). Я немного отредактировал ошибки и сделал текст читабельней)

P.S. Так как я не понял, как разместить текст, что б были видны все теги, то вот. Там простой текстовичек. Скопируй все, что в нем написано в первый пост.


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...


Сообщение отредактировал Stalker_Shooter - Четверг, 18 Августа 2011, 11:09
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг