Indlæs X-filen, og se modellen

Side opdateret :
Dato for oprettelse af side :

resumé

Modeldataene læses fra X-filen (.x) og vises.

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

Driftsmiljø

Forudsætninger

Understøttede XNA-versioner
  • 2.0
  • 3.0
  • 3.1
  • 4.0
Understøttede platforme
  • Windows (XP SP2, Vista. 7)
  • Xbox360
  • Windows Phone 7
Windows påkrævet Vertex Shader-version 2.0
Windows påkrævet Pixel Shader-version 2.0

Driftsmiljø

perron
  • Windows 7
  • Xbox360
  • Windows Phone 7-emulator

stof

Hvad er en X-fil

En X-fil er en fil, der kan bruges som modeldata ved at kombinere toppunktsdata med placeringsoplysninger og normal information, teksturreferencestier, rammer, anime-data osv. i én. Der er mange andre filer, der indeholder modeldata, men X-filer blev brugt som standardmodeldata indtil DirectX9 og understøttes som et standardformat af XNA.

X-filer sparer dig for besværet med at opbygge toppunktsdata direkte i programmet og gør det muligt at tegne geometrien af komplekse modeller med meget forenklet kodeskrivning. Da selve dataene er beskrevet i en X-fil, er fordelen, at programmet ikke behøver at blive ændret, selvom formen ændres.

Modeldatafiler såsom X-filer oprettes hovedsageligt med "modelleringssoftware" og outputfiler. Jeg bruger hovedsageligt modelleringssoftware kaldet "Metasequoia", og der er en shareware-version og en freeware-version, men jeg anbefaler freeware-versionen, fordi den kan udsende X-filer. Det er en af de få japanske software, der kan udsende X-filer med freeware.

I dette tilfælde oprettede jeg en simpel model som den nedenfor og udsendte den som en X-fil.

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

Når den udskrives, vil filen se ud som den nedenfor. I dette tilfælde bruger vi navnet "Model.x".

出力したXファイル

Registrer X filer til indhold

Føj den X-fil, du har oprettet, til mappen Indhold i dit projekt. Du kan finde flere oplysninger om, hvordan du tilføjer ressourcer, under "Indlæsning af ressourcer (indhold)".

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

mark

Hvis du vil læse data fra en X-fil og vise den, skal du bruge klassen "Model". Model-klassen indeholder alle de "toppunktsbuffere", "indeksbuffere", "effekter", "teksturer" osv., der er nødvendige for at vise modellen, så du behøver kun at forberede denne.

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

Indlæser modeller

Modeldataene indlæses fra "ContentManager" i metoden "Game.LoadContent". Det er det samme som at indlæse teksturer, skrifttyper osv. Aktivnavnet registreres som "Model".

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

Indstilling af parametre

Denne gang ændres parametrene ikke hele tiden, så de indstilles umiddelbart efter indlæsning af modeldataene. Hvis modellen konstant skifter position eller kameraindstillinger, tror jeg, at den vil blive indstillet i Game.Draw-metoden.

// 今回はパラメータをあらかじめ設定しておく
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
        );
    }
}

Da en enkelt "model" kan indeholde flere masker, er den opregnet i "Model.Meshes" og indstillet til alle masker.

Da en "ModelMesh" kan indeholde flere effekter, viser jeg dem i "ModelMesh.Effects" og indstiller dem til alle effekter.

Her har vi forudindstillet standardlysindstillingerne, visningsmatrixen og projektionsmatrixen.

tegning

Det er meget enkelt at tegne en model, og du kan tegne den med en enkelt "ModelMesh.Draw" -metode. Da vi tegner i mesh-enheder, bruger vi "Model.Meshes" til at optælle og tegne alle meshes.

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

ModelMesh.Draw metode

Tegn hver ModelMeshPart ved hjælp af de forudindstillede effekter.

Alle koder

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);
        }
    }
}