3D-Модели

Последнее обновление: 14.11.2015

Треугольники, линии, текстуры - это конечно все хорошо, но в реальности в большинстве случаев для создания трехмерных объектов будут использоваться модели.

Для загрузки 3D-моделей MonoGame использует специальную библиотеку Assimp. Наиболее распространенными форматами моделей являются FBX и COLLADA(dae). Также могут использоваться такие форматы как X и OBJ. Для создания моделей применяются специальные программы, например, Blender, и после создания модель экспортируется в проект.

Итак, создадим новый проект. И прежде всего добавим опять же с помощью Content.mgcb в качестве ресурса имеющуюся у нас модель. В принципе сейчас не проблема найти бесплатные 3d модели в различных форматах, либо создать свою с помощью специализированных инструментов, таких как Blender.

Если модель имеет зависимость от текстуры, то нам соответственно надо добавить файл модели и все файлы используемых текстур:

3D Модели в MonoGame

В данном случае я добавил файл модели Rock4.dae - модель в формате COLLADA, также файл Rock-Texture-Surface.jpg, который используется для текстурирования модели.

И после добавления модели определим код приложения:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace _3DModelingApp
{
    public class Game1 : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Matrix projectionMatrix;
        Matrix viewMatrix;
        Matrix worldMatrix;

        Model model; // переменная для хранения модели

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            viewMatrix = Matrix.CreateLookAt(new Vector3(0, 0, 6), new Vector3(0, 0, 0), Vector3.Up);

            projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
                (float)Window.ClientBounds.Width / (float)Window.ClientBounds.Height,
                1, 100);

            worldMatrix = Matrix.CreateWorld(new Vector3(0f, 0f, 0f), new Vector3(0, 0, -1), Vector3.Up);

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            model = Content.Load<Model>("Rock4");
        }

        protected override void UnloadContent()
        {
        }
        
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
                Exit();

            if (Keyboard.GetState().IsKeyDown(Keys.Up))
            {
                worldMatrix *= Matrix.CreateRotationX(MathHelper.ToRadians(1));
            }
            if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                worldMatrix *= Matrix.CreateRotationX(-1 * MathHelper.ToRadians(1));
            }
            if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                worldMatrix *= Matrix.CreateRotationY(MathHelper.ToRadians(1));
            }
            if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                worldMatrix *= Matrix.CreateRotationY(-1 * MathHelper.ToRadians(1));
            }
            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.View = viewMatrix;
                    effect.World = worldMatrix;
                    effect.Projection = projectionMatrix;
                }
                mesh.Draw();
            }
            base.Draw(gameTime);
        }
    }
}

В результате на экране модель будет выглядеть примерно следующим образом:

3D Models in MonoGame

Для начала нам надо загрузить модель, которая будет представлять объект Model:

model = Content.Load<Model>("Rock4");

Также здесь передаем название файла модели без расширения. Файл текстуры загружать не надо.

Несмотря на то, что в данном случае используется одна модель, представляющая камень или кусок скалы, но на самом деле трехмерная модель представляет сложный объект, который может состоять из множества более мелких частей или мэшей (mesh).

Все мэши представляют объекты ModelMesh, которые в классе Model доступны в виде коллекции в свойстве Meshes.

Каждый мэш может содержать материалы и цвета, текстуры - все, что используется для отрисовке данного мэша. Мэш необязательно должен быть покрыт только одним цветом или текстурой; мы можем использовать для одного мэша несколько различных материалов. И в данном случае мы пробегаемся по всем эффектам мэша, которые представляют объект BasicEffect, устанавливаем матрицы, и затем вызываем метод mesh.Draw() для отрисовки мэша:

foreach (ModelMesh mesh in model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        effect.View = viewMatrix;
        effect.World = worldMatrix;
        effect.Projection = projectionMatrix;
    }
    mesh.Draw();
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850