Laden Sie die X-Datei, und zeigen Sie das Modell an.

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Zusammenfassung

Die Modelldaten werden aus der X-Datei (.x) gelesen und angezeigt.

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

Betriebsumgebung

Voraussetzungen

Unterstützte XNA-Versionen
  • 2.0
  • 3.0
  • 3.1
  • 4.0
Unterstützte Plattformen
  • Windows (XP SP2, Vista. 7)
  • Xbox360
  • Windows Phone 7
Erforderliche Vertex-Shader-Version für Windows 2.0
Erforderliche Pixel-Shader-Version für Windows 2.0

Betriebsumgebung

Bahnsteig
  • Windows 7
  • Xbox360
  • Windows Phone 7-Emulator

Substanz

Was ist eine X-Datei?

Eine X-Datei ist eine Datei, die als Modelldaten verwendet werden kann, indem Vertex-Daten mit Standortinformationen und normalen Informationen, Texturreferenzpfaden, Frames, Anime-Daten usw. in einer kombiniert werden. Es gibt viele andere Dateien, die Modelldaten enthalten, aber X-Dateien wurden bis DirectX9 als Standardmodelldaten verwendet und werden von XNA als Standardformat unterstützt.

X-Dateien ersparen Ihnen die Mühe, Vertex-Daten direkt im Programm zu erstellen, und ermöglichen es, die Geometrie komplexer Modelle mit sehr vereinfachtem Schreiben von Code zu zeichnen. Da die Daten selbst in einer X-Datei beschrieben werden, besteht der Vorteil darin, dass das Programm auch dann nicht geändert werden muss, wenn sich die Form ändert.

Modelldatendateien wie z.B. X-Dateien werden hauptsächlich mit "Modellierungssoftware" und Ausgabedateien erstellt. Ich verwende hauptsächlich eine Modellierungssoftware namens "Metasequoia", und es gibt eine Shareware-Version und eine Freeware-Version, aber ich empfehle die Freeware-Version, weil sie X-Dateien ausgeben kann. Es ist eine der wenigen japanischen Software, die X Dateien mit Freeware ausgeben kann.

In diesem Fall habe ich ein einfaches Modell wie das folgende erstellt und es als X-Datei ausgegeben.

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

Bei der Ausgabe sieht die Datei wie folgt aus. In diesem Fall verwenden wir den Namen "Model.x".

出力したXファイル

Registrieren von X-Dateien für Inhalte

Fügen Sie die von Ihnen erstellte X-Datei dem Ordner "Inhalt" Ihres Projekts hinzu. Weitere Informationen zum Hinzufügen von Ressourcen finden Sie unter "Laden von Ressourcen (Inhalten)".

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

Feld

Um Daten aus einer X-Datei zu lesen und anzuzeigen, verwenden Sie die Klasse "Model". Die Model-Klasse enthält alle "Vertex-Puffer", "Index-Puffer", "Effekte", "Texturen" usw., die für die Anzeige des Modells erforderlich sind, sodass Sie nur dieses Modell vorbereiten müssen.

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

Laden von Modellen

Die Modelldaten werden aus dem "ContentManager" in der Methode "Game.LoadContent" geladen. Es ist dasselbe wie das Laden von Texturen, Schriftarten usw. Der Asset-Name wird als "Model" registriert.

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

Festlegen von Parametern

Diesmal ändern sich die Parameter nicht ständig, so dass sie sofort nach dem Laden der Modelldaten gesetzt werden. Wenn das Modell ständig Positionen oder Kameraeinstellungen ändert, wird es meiner Meinung nach in der Game.Draw-Methode festgelegt.

// 今回はパラメータをあらかじめ設定しておく
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 ein einzelnes "Model" mehrere Netze enthalten kann, wird es in "Model.Meshes" aufgelistet und auf alle Netze festgelegt.

Da ein "ModelMesh" mehrere Effekte enthalten kann, liste ich sie in "ModelMesh.Effects" auf und setze sie auf alle Effekte.

Hier haben wir die Standardlichteinstellungen, die Ansichtsmatrix und die Projektionsmatrix voreingestellt.

Zeichnung

Das Zeichnen eines Modells ist sehr einfach, und Sie können es mit einer einzigen "ModelMesh.Draw"-Methode zeichnen. Da wir in Netzeinheiten zeichnen, verwenden wir "Model.Meshes", um alle Netze aufzulisten und zu zeichnen.

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

ModelMesh.Draw Methode

Zeichnen Sie jedes ModelMeshPart mit den voreingestellten Effekten.

Alle Codes

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