Быть может кто-то из Вас знает игру 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.