Chargez le fichier X et visualisez le modèle
résumé
Les données du modèle sont lues à partir du fichier X (.x) et affichées.
Environnement d’exploitation
Conditions préalables
Versions XNA prises en charge |
|
Plates-formes prises en charge |
|
Version du Vertex Shader requise par Windows | 2.0 |
Version du Pixel Shader requise par Windows | 2.0 |
Environnement d’exploitation
plateforme |
|
substance
Qu’est-ce qu’un fichier X ?
Un fichier X est un fichier qui peut être utilisé comme données de modèle en combinant les données de sommet avec des informations de localisation et des informations normales, des chemins de référence de texture, des images, des données d’anime, etc. en un seul. Il existe de nombreux autres fichiers qui contiennent des données de modèle, mais les fichiers X étaient utilisés comme données de modèle standard jusqu’à DirectX9 et sont pris en charge en tant que format standard par XNA.
Les fichiers X vous évitent d’avoir à construire des données de vertex directement dans le programme et permettent de dessiner la géométrie de modèles complexes avec une écriture de code très simplifiée. Étant donné que les données elles-mêmes sont décrites dans un fichier X, l’avantage est que le programme n’a pas besoin d’être modifié même si la forme change.
Les fichiers de données de modèle tels que les fichiers X sont principalement créés avec un « logiciel de modélisation » et des fichiers de sortie. J’utilise principalement un logiciel de modélisation appelé « Metasequoia », et il existe une version shareware et une version freeware, mais je recommande la version freeware car elle peut produire X fichiers. C’est l’un des rares logiciels japonais qui peut produire des fichiers X avec un logiciel gratuit.
Dans ce cas, j’ai créé un modèle simple comme celui ci-dessous et je l’ai sorti sous forme de fichier X.
Lors de la sortie, le fichier ressemblera à celui ci-dessous. Dans ce cas, nous utiliserons le nom « Model.x ».
Enregistrer X fichiers dans le contenu
Ajoutez le fichier X que vous avez créé au dossier Contenu de votre projet. Pour plus de détails sur l’ajout de ressources, voir « Chargement de ressources (contenu) ».
champ
Pour lire les données d’un fichier X et les afficher, utilisez la classe « Model ». La classe Model contient tous les « vertex buffers », « index buffers », « effects », « textures », etc. nécessaires à l’affichage du modèle, vous n’avez donc qu’à préparer celui-ci.
<summary>
モデル
</summary>
private Model model = null;
Chargement des modèles
Les données du modèle sont chargées à partir du « ContentManager » dans la méthode « Game.LoadContent ». C’est la même chose que de charger des textures, des polices, etc. Le nom de l’actif est enregistré en tant que « Modèle ».
// モデルを作成
this.model = this.Content.Load<Model>("Model");
Définition des paramètres
Cette fois, les paramètres ne changent pas tout le temps, ils sont donc définis immédiatement après le chargement des données du modèle. Si le modèle change constamment de position ou de paramètres de caméra, je pense qu’il sera défini dans la méthode 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
);
}
}
Étant donné qu’un seul « Modèle » peut contenir plusieurs maillages, il est énuméré dans « Model.Meshes » et défini sur tous les maillages.
De plus, comme un « ModelMesh » peut contenir plusieurs effets, je les liste dans « ModelMesh.Effects » et les définis sur tous les effets.
Ici, nous avons préréglé les paramètres d’éclairage par défaut, la matrice de vue et la matrice de projection.
dessin
Dessiner un modèle est très simple, et vous pouvez le dessiner avec une seule méthode « ModelMesh.Draw ». Comme nous dessinons en unités de maillage, nous utilisons « Model.Meshes » pour énumérer et dessiner tous les maillages.
// モデルを描画
foreach (ModelMesh mesh in this.model.Meshes)
{
mesh.Draw();
}
ModelMesh.Draw
méthode
Dessinez chaque ModelMeshPart à l’aide des effets prédéfinis.
Tous les 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);
}
}
}