Заредете X файла и вижте модела

Страницата се актуализира :
Дата на създаване на страница :

резюме

Данните за модела се четат от X файла (.x) и се показват.

Xファイルを読み込んでモデルを表示

Работна среда

Предпоставки

Поддържани версии на XNA
  • 2.0
  • 3.0
  • 3.1
  • 4.0
Поддържани платформи
  • Windows (XP SP2, Vista. 7)
  • Xbox360
  • Windows Phone 7
Необходима версия на Vertex Shader за Windows 2.0
Необходима версия на пикселния шейдър за Windows 2.0

Работна среда

платформа
  • Windows 7
  • Xbox360
  • Емулатор на Windows Phone 7

вещество

Какво е X файл

X файлът е файл, който може да се използва като данни за модела чрез комбиниране на върхови данни с информация за местоположението и нормална информация, референтни пътища за текстури, рамки, аниме данни и т.н. в едно. Има много други файлове, които съдържат данни за модела, но X файловете са били използвани като стандартни данни за модела до DirectX9 и се поддържат като стандартен формат от XNA.

X файловете ви спестяват неприятностите да изграждате върхови данни директно в програмата и правят възможно начертаването на геометрията на сложни модели с много опростено писане на код. Тъй като самите данни са описани в X файл, предимството е, че програмата не е необходимо да се променя, дори ако формата се промени.

Файловете с данни за модели, като например X файлове, се създават главно с "софтуер за моделиране" и изходни файлове. Използвам основно софтуер за моделиране, наречен "Metasequoia", и има shareware версия и безплатна версия, но препоръчвам безплатната версия, защото може да извежда X файлове. Това е един от малкото японски софтуери, които могат да извеждат X файлове с безплатен софтуер.

В този случай създадох прост модел като този по-долу и го изведох като X файл.

メタセコイアでモデルを作成

При извеждане файлът ще изглежда като този по-долу. В този случай ще използваме името "Model.x".

出力したXファイル

Регистриране на X файлове в съдържание

Добавете X файла, който сте създали, в папката "Съдържание" на вашия проект. За подробности как да добавяте ресурси вижте "Зареждане на ресурси (съдържание)".

Xファイルをコンテンツに追加

поле

За да прочетете данни от X файл и да ги покажете, използвайте класа "Модел". Класът Model съдържа всички "върхови буфери", "индексни буфери", "ефекти", "текстури" и т.н., необходими за показване на модела, така че трябва само да подготвите този.

/// <summary>
/// モデル
/// </summary>
private Model model = null;

Зареждане на модели

Данните за модела се зареждат от "ContentManager" в метода "Game.LoadContent". Това е същото като зареждането на текстури, шрифтове и т.н. Името на актива е регистрирано като "Модел".

// モデルを作成
this.model = this.Content.Load<Model>("Model");

Настройка на параметри

Този път параметрите не се променят през цялото време, така че се задават веднага след зареждане на данните на модела. Ако моделът постоянно променя позициите или настройките на камерата, мисля, че ще бъде зададен в метода Game.Draw.

// 今回はパラメータをあらかじめ設定しておく
foreach (ModelMesh mesh in this.model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        // デフォルトのライト適用
        effect.EnableDefaultLighting();

        // ビューマトリックスをあらかじめ設定 ((9, 9, 9) から原点を見る)
        effect.View = Matrix.CreateLookAt(
            new Vector3(9.0f, 9.0f, 9.0f),
            Vector3.Zero,
            Vector3.Up
        );

        // プロジェクションマトリックスをあらかじめ設定
        effect.Projection = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.ToRadians(45.0f),
            (float)this.GraphicsDevice.Viewport.Width /
                (float)this.GraphicsDevice.Viewport.Height,
            1.0f,
            100.0f
        );
    }
}

Тъй като един "Модел" може да съдържа множество мрежи, той е изброен в "Model.Meshes" и се задава на всички мрежи.

Също така, тъй като един "ModelMesh" може да съдържа няколко ефекта, аз ги изброявам в "ModelMesh.Effects" и ги задавам на всички ефекти.

Тук имаме предварително зададени настройките на светлината по подразбиране, матрицата на изглед и матрицата на проекцията.

рисунка

Рисуването на модел е много просто и можете да го нарисувате с един метод "ModelMesh.Draw". Тъй като чертаем в мрежести единици, използваме "Model.Meshes", за да изброим и начертаем всички мрежи.

// モデルを描画
foreach (ModelMesh mesh in this.model.Meshes)
{
    mesh.Draw();
}

ModelMesh.Draw метод

Начертайте всяка ModelMeshPart с помощта на предварително зададените ефекти.

Всички кодове

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;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif

namespace XFile
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// モデル
        /// </summary>
        private Model model = null;


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

#if WINDOWS_PHONE
            // Windows Phone のデフォルトのフレームレートは 30 FPS
            this.TargetElapsedTime = TimeSpan.FromTicks(333333);

            // バックバッファサイズの設定
            this.graphics.PreferredBackBufferWidth = 480;
            this.graphics.PreferredBackBufferHeight = 800;

            // フルスクリーン表示
            this.graphics.IsFullScreen = true;
#endif
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // TODO: ここに初期化ロジックを書いてください

            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // モデルを作成
            this.model = this.Content.Load<Model>("Model");

            // 今回はパラメータをあらかじめ設定しておく
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // デフォルトのライト適用
                    effect.EnableDefaultLighting();

                    // ビューマトリックスをあらかじめ設定 ((9, 9, 9) から原点を見る)
                    effect.View = Matrix.CreateLookAt(
                        new Vector3(9.0f, 9.0f, 9.0f),
                        Vector3.Zero,
                        Vector3.Up
                    );

                    // プロジェクションマトリックスをあらかじめ設定
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                        MathHelper.ToRadians(45.0f),
                        (float)this.GraphicsDevice.Viewport.Width /
                            (float)this.GraphicsDevice.Viewport.Height,
                        1.0f,
                        100.0f
                    );
                }
            }
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
            // ゲームを終了させます
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            // TODO: ここに更新処理を記述してください

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // モデルを描画
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                mesh.Draw();
            }

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}