| Невозможно пройти тесты, в окне с вопросами пусто |
Основы трехмерной графики в XNA
23.2. Вывод трехмерных моделей
Выводя графические примитивы, рассмотренные в предыдущем примере, довольно сложно и трудоемко создавать игровые сцены. Гораздо большими возможностями обладает подход к работе с трехмерной графикой, использующий вывод заранее подготовленных трехмерных моделей. Само по себе создание трехмерных моделей требует немало времени и искусства, для этого применяются специальные программы. В деле создания игр выделяется отдельная группа сотрудников – 3D-моделеров, которые занимаются исключительно созданием трехмерных моделей.
Мы использовали готовую бесплатную трехмерную модель Free Lowpoly Round Shield с сайта http://www.turbosquid.com.
Для вывода модели на экран необходимо добавить в проект соответствующие ей ресурсы, в нашем случае – модель в формате .FBX и текстуру в формате .JPG. Далее следует загрузить модель в игру, настроить её свойства и вывести на экран.
В трехмерной графике существует такое понятие, как Mesh (Сеть, иногда пользуются русской калькой с этого слова – мэш). Трехмерные модели состоят из сетей – линий, соединяющих вершины. Модель может состоять из нескольких взаимодействующих сетей, каждую из которых нужно обработать при выводе модели.
Создадим новый проект – P16_2 для демонстрации техники вывода трехмерной модели. На рис. 23.2 вы можете видеть окно Обозреватель решений этого проекта и окно Свойства для текстуры, предназначенной для наложения на модель. Трехмерные модели, которые предусматривают использование текстур, содержат в своих файлах указание на то, каким образом накладывать текстуру на объект, а так же – на файл текстуры. В нашем случае адрес файла текстуры задан в относительном выражении – то есть система будет искать этот файл в той же папке, в которой расположен файл трехмерной модели. Текстура подвергается преобразованиям в соответствии с командами, записанными в файле трехмерной модели, поэтому мы отключили параметр Действия при построении в свойствах текстуры.
пример 23.2 содержит код класса Game1, реализующего вывод модели на экран.
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace P16_2
{
/// <summary>
/// Это главный тип игры
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
// Модель для вывода
Model myModel;
//Мировая матрица
Matrix WorldMatrix;
//Соотношение сторон окна вывода
float aspectRatio;
//Угол поворота для вращения модели
float angle;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.IsFullScreen = true;
// Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду.
TargetElapsedTime = TimeSpan.FromTicks(333333);
// Дополнительный заряд аккумулятора заблокирован.
InactiveSleepTime = TimeSpan.FromSeconds(1);
}
/// <summary>
/// Позволяет игре выполнить инициализацию, необходимую перед запуском.
/// Здесь можно запросить нужные службы и загрузить неграфический
/// контент. Вызов base.Initialize приведет к перебору всех компонентов и
/// их инициализации.
/// </summary>
protected override void Initialize()
{
// ЗАДАЧА: добавьте здесь логику инициализации
base.Initialize();
}
/// <summary>
/// LoadContent будет вызываться в игре один раз; здесь загружается
/// весь контент.
/// </summary>
protected override void LoadContent()
{
//загрузка модели
myModel = Content.Load<Model>("RoundShield");
//Установка соотношения сторон окна вывода
aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /
(float)graphics.GraphicsDevice.Viewport.Height;
// ЗАДАЧА: используйте здесь this.Content для загрузки контента игры
}
/// <summary>
/// UnloadContent будет вызываться в игре один раз; здесь выгружается
/// весь контент.
/// </summary>
protected override void UnloadContent()
{
// ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
}
/// <summary>
/// Позволяет игре запускать логику обновления мира,
/// проверки столкновений, получения ввода и воспроизведения звуков.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Update(GameTime gameTime)
{
// Позволяет выйти из игры
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
//увеличим угол поворота на 1
angle++;
//установим новую мировую матрицу
//поворот по оси Y равен углу angle, поворот по X -
//angle, деленному на 5
WorldMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(angle)) *
Matrix.CreateRotationX(MathHelper.ToRadians(angle / 5.0f));
//Для каждой сети в модели
foreach (ModelMesh mesh in myModel.Meshes)
{
//Для каждого эффекта в сети
foreach (BasicEffect effect in mesh.Effects)
{
//Установить освещение
effect.AmbientLightColor = new Vector3(1.0f, 1.0f, 1.0f);
effect.DiffuseColor = new Vector3(1.0f, 1.0f, 1.0f);
effect.LightingEnabled = true;
//установить матрицы
effect.World = WorldMatrix;
effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 120.0f), Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 1000.0f);
}
}
base.Update(gameTime);
}
/// <summary>
/// Вызывается, когда игра отрисовывается.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// Вывод модели
foreach (ModelMesh mesh in myModel.Meshes)
{
mesh.Draw();
}
base.Draw(gameTime);
}
}
}
Листинг
23.2.
Код класса Game1
На рис. 23.3 вы можете видеть окно проекта.
23.3. Выводы
В этой лабораторной работе мы ознакомились с формированием трехмерных объектов средствами XNA и с выводом заранее созданных трехмерных объектов. Второй способ гораздо перспективнее первого, так как позволяет конструировать модели в специальных визуальных редакторах, а в XNA лишь выводить модели и управлять ими. Первый способ предусматривает полное описание модели средствами XNA.
23.4. Задание
Создайте или найдите в Интернете трехмерную модель, выведите её на экран, используя BasicEffect, освойте управление игровой сценой с помощью рассмотренных в лабораторной работе методов.

