Ielādējiet X failu un skatiet modeli

Lapa atjaunota :
Lapas izveides datums :

Kopsavilkuma

Modeļa dati tiek nolasīti no X faila (.x) un parādīti.

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

Darbības vide

Priekšnoteikumi

Atbalstītās XNA versijas
  • 2.0
  • 3.0
  • 3.1
  • 4.0
Atbalstītās platformas
  • Windows (XP SP2, Vista. 7)
  • Xbox360
  • 7 Windows Phone
Windows nepieciešamā Vertex Shader versija 2.0
Windows nepieciešamā Pixel Shader versija 2.0

Darbības vide

platforma
  • Operētājsistēmā Windows 7
  • Xbox360
  • Windows Phone 7 Emulators

viela

Kas ir X fails

X fails ir fails, ko var izmantot kā modeļa datus, apvienojot virsotņu datus ar atrašanās vietas informāciju un normālu informāciju, tekstūras atsauces ceļiem, rāmjiem, anime datiem utt. Ir daudzi citi faili, kas satur modeļa datus, bet X faili tika izmantoti kā standarta modeļa dati līdz DirectX9, un XNA tos atbalsta kā standarta formātu.

X faili ietaupa problēmas, veidojot virsotņu datus tieši programmā, un ļauj uzzīmēt sarežģītu modeļu ģeometriju ar ļoti vienkāršotu koda rakstīšanu. Tā kā paši dati ir aprakstīti X failā, priekšrocība ir tā, ka programma nav jāmaina pat tad, ja mainās forma.

Modeļa datu faili, piemēram, X faili, galvenokārt tiek veidoti, izmantojot "modelēšanas programmatūru" un izvades failus. Es galvenokārt izmantoju modelēšanas programmatūru ar nosaukumu "Metasequoia", un ir shareware versija un freeware versija, bet es iesaku freeware versiju, jo tā var izvadīt X failus. Tā ir viena no nedaudzajām japāņu programmatūrām, kas var izvadīt X failus ar bezmaksas programmatūru.

Šajā gadījumā es izveidoju vienkāršu modeli, piemēram, zemāk esošo, un izvadīju to kā X failu.

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

Izvadot, fails izskatīsies kā zemāk redzamais. Šajā gadījumā mēs izmantosim nosaukumu "Model.x".

出力したXファイル

X failu reģistrēšana saturā

Pievienojiet izveidoto X failu sava projekta satura mapei. Detalizētu informāciju par resursu pievienošanu skatiet sadaļā "Resursu (satura) ielāde".

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

lauks

Lai lasītu datus no X faila un parādītu tos, izmantojiet klasi "Modelis". Modeļa klasē ir visi "virsotņu buferi", "indeksa buferi", "efekti", "faktūras" utt., Kas nepieciešami modeļa parādīšanai, tāpēc jums ir nepieciešams tikai sagatavot šo.

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

Modeļu ielāde

Modeļa dati tiek ielādēti no "ContentManager" metodes "Game.LoadContent". Tas ir tas pats, kas ielādēt faktūras, fontus utt. Aktīva nosaukums ir reģistrēts kā "Modelis".

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

Parametru iestatīšana

Šoreiz parametri visu laiku nemainās, tāpēc tie tiek iestatīti tūlīt pēc modeļa datu ielādes. Ja modelis pastāvīgi maina pozīcijas vai kameras iestatījumus, es domāju, ka tas tiks iestatīts Game.Draw metodē.

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

Tā kā vienā "Modelī" var būt vairākas acis, tas tiek uzskaitīts "Model.Meshes" un iestatīts uz visām acīm.

Turklāt, tā kā viens "ModelMesh" var saturēt vairākus efektus, es tos uzskaitu "ModelMesh.Effects" un iestatu tos uz visiem efektiem.

Šeit mēs esam iepriekš iestatījuši noklusējuma gaismas iestatījumus, skata matricu un projekcijas matricu.

zīmējums

Modeļa zīmēšana ir ļoti vienkārša, un to var uzzīmēt ar vienu "ModelMesh.Draw" metodi. Tā kā mēs zīmējam acu vienībās, mēs izmantojam "Model.Meshes", lai uzskaitītu un uzzīmētu visas acis.

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

ModelMesh.Draw metode

Zīmējiet katru ModelMeshPart, izmantojot iepriekš iestatītos efektus.

Visi kodi

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