|
Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Вывод трехмерных объектов на экран
Вывод трехмерных моделей
Выводя графические примитивы, рассмотренные в предыдущем примере, довольно сложно и трудоемко создавать игровые сцены. Гораздо большими возможностями обладает подход к работе с трехмерной графикой, использующий вывод заранее подготовленных трехмерных моделей. Само по себе создание трехмерных моделей требует немало времени и искусства, для этого применяются специальные программы. В деле создания игр выделяется отдельная группа сотрудников – 3D-моделеров, которые занимаются исключительно созданием трехмерных моделей.
Мы использовали готовую бесплатную трехмерную модель Free Lowpoly Round Shield с сайта http://www.turbosquid.com.
Для вывода модели на экран необходимо добавить в проект соответствующие ей ресурсы, в нашем случае – модель в формате .FBX и текстуру в формате .JPG. Далее следует загрузить модель в игру, настроить ее свойства и вывести на экран.
В трехмерной графике существует такое понятие, как Mesh (Сеть, иногда пользуются русской калькой с этого слова – мэш). Трехмерные модели состоят из сетей – линий, соединяющих вершины. Модель может состоять из нескольких взаимодействующих сетей, каждую из которых нужно обработать при выводе модели.
Создадим новый проект – P14_2 для демонстрации техники вывода трехмерной модели. На рис. 19.2. вы можете видеть окно Project Explorer этого проекта и окно Properties для текстуры, предназначенной для наложения на модель. Трехмерные модели, которые предусматривают использование текстур, содержат в своих файлах указание на то, каким образом накладывать текстуру на объект, а так же – на файл текстуры. В нашем случае адрес файла текстуры задан в относительном выражении – то есть система будет искать этот файл в той же папке, в которой расположен файл трехмерной модели. Текстура подвергается преобразованиям в соответствии с командами, записанными в файле трехмерной модели, поэтому мы отключили параметр Build Action в свойствах текстуры.
Листинг 19.2. содержит код класса Game1, реализующего вывод модели на экран.
using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;
namespace P14_2
{
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";
}
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
protected override void LoadContent()
{
//загрузка модели
myModel = Content.Load<Model>("RoundShield");
//Установка соотношения сторон окна вывода
aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /
(float)graphics.GraphicsDevice.Viewport.Height;
}
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
protected override void Update(GameTime gameTime)
{
//увеличим угол поворота на 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.LightingEnabled = true;
effect.EnableDefaultLighting();
//установить матрицы
effect.World = WorldMatrix;
effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 119.0f), Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 1000.0f);
}
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// Вывод модели
foreach (ModelMesh mesh in myModel.Meshes)
{
mesh.Draw();
}
base.Draw(gameTime);
}
}
}
Листинг
19.2.
Код класса Game1
На рис. 19.3. вы можете видеть окно проекта P14_2.

