XNA GSEとたわむれる チュートリアル1 ステップ2~ゴール


早速メニューの「ファイル」→「新しいプロジェクト」を選択。
さらに「Windows Game」を選択して、プロジェクト名を命名しましょう。
例えば今回は「yu++ XNA Game 01」としました。
xna_05

さて、いきなりコードが書かれていたりして面食らっちゃいそうだけれども、とりあえず落ち着いて。
右手にあるソリューション エクスプローラを見て欲しいところ。
無い場合は「表示」→「ソリューション エクスプローラ」で表示できるはず。
ソリューション エクスプローラにはこのプロジェクトで必要なソースコード、パラメータ、ファイルなどがツリー構造で表示される。

ここで、プロジェクトファイル(上から2番目の奴)を選択。
右クリックで「追加」→「新しいフォルダ」でフォルダを作って「Content」という名前にする。
ここのフォルダ名は日本語で通るかわからないので、念のため英語で。
さらにContentフォルダを右クリックしてさらにフォルダを作る。
名前は「Models」。
同様に「Textures」フォルダも作る。
xna_06

一応ModelsとTexturesフォルダはあるものの、当然中身はカラ。
そこでさっき構築したスペースウォーのプロジェクトファイルから3Dモデルとテクスチャのファイルを拝借することに。
Modelsフォルダを右クリックして、「追加」→「既存の項目」を開く。
ファイルの種類を「Content Pipeline Files」か「すべてのファイル」に選択。
そしてスペースウォーがあるフォルダのContent\Models内のp1_wedge.fbxを選択して「追加」を押す。
さらにTexturesフォルダをクリックして、スペースウォーフォルダのContent\Textures内にあるwedge_p1_diff_v1.tgaをTexturesフォルダにドラッグアンドドロップする。
すると以下の通りになる。
xna_07_b

ステップ3: コンテントパイプラインを使ってモデルを読み込もう
さらにコードに目を向けてみよう。
Game1.csを開いてCtrl+HでLoadGraphicsContentを検索。
見つかったら下記のコードを打ち込む。

//3Dモデルを描画
Model myModel;
protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent) {
myModel = content.Load<Model>("Content\\Models\\p1_wedge");
}
}

この記述により、LoadGraphicsContentが呼び出されたときにコンテントパイプラインにp1_wedge.fbxが渡される、と言うことらしい。
当然だけど、このファイルのパスが間違ってるとエラーが出る。
アセット名を変更した場合もこちら側のアセット名を変更する必要があるし、フォルダを移動した場合もしかり。

チュートリアルにはmyModel = content.Load(“Content\\Models\\pl_wedge”);の記述がバックスラッシュになっているんだけど、日本語環境ではなぜだか知らないけど\で表されるので、これであっているのです。
そ、そう信じたいんだけれども・・・どうなんだろう?
ステップ4: モデルを画面に表示させよう(そして回転させよう)
こっからは結構ガリガリいじるみたい。
今回いじるのはDrawメソッドとUpdateメソッド。
Drawメソッドではテクスチャとライトの加味して画面に表示する。
Updateメソッドではモデルに対して時間が経過すると変わっていくようにさせる。と言った感じ。

まずはDrawメソッドを見つけるためにDrawを検索。
protected override void Draw(GameTime gameTime)を見つけよう。
そしてその前後に下記のコードを追加する。

//空間内におけるモデルの位置と角度
Vector3 modelPosition = Vector3.Zero;
float modelRotation = 0.0f;
//自分たちが見るために、空間内におけるカメラ位置を設定
Vector3 cameraPosition = new Vector3(0.0f, 50.0f, 5000.0f);
//投影されるアスペクト比を設定
float aspectRatio = 640.0f / 480.0f;
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
//変形させるための元をコピー
Matrix[] transforms = new Matrix[myModel.Bones.Count];
myModel.CopyAbsoluteBoneTransformsTo(transforms);
//複数のメッシュを持ったモデルを描画し、それを繰り返す
foreach (ModelMesh mesh in myModel.Meshes) {
//ここではカメラと投射が良くなるようなメッシュの位置を設定
foreach (BasicEffect effect in mesh.Effects) {
effect.EnableDefaultLighting();
effect.World = transforms[mesh.ParentBone.Index]
* Matrix.CreateRotationY(modelRotation)
* Matrix.CreateTranslation(modelPosition);
effect.View = Matrix.CreateLookAt(
cameraPosition,
Vector3.Zero,
Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45.0f),
aspectRatio,
1.0f,
10000.0f);
}
//エフェクト設定を避けてメッシュを描画</span>
mesh.Draw();
}
}

今のコードは画面に表示するための3Dに必須な数学とライティングを施すための機能を提供してくれるというメソッドを挿入しました。
Worldマトリックスは空間内での位置を変えるために使うもの。
Viewマトリックスはカメラ(つまり視点)の位置を変えるために使うもの。
そして、Projectionマトリックスは3D空間をどのように2Dのディスプレイに表示するのかをコントロールするために使うらしい。

さらにCopyAbsoluteBoneTransformsToとそれに関連するWorldマトリックスの設定は今回実は必要ないのだとか。
ただ、凝ったメッシュを使ったり、ボーンを入れたりする場合、かなり強力にコントロールができるらしい。
で、今すくコンパイルできるけど我慢しろって書いてあるんですが・・・我慢という言葉を知らないのでデバッグしちゃいましょう。

メニューの「デバッグ」→「デバッグの開始」でデバッグが始まります。
で、そこでエラーが出た場合はどっかコードが間違ってます。
ちなみに、今デバッグしたら、ステップ2で追加したコードmyModel = content.Load(“Content\\Models\\p1_wedge”);のp1_wedgepl_wedgeと書いていたため、早速怒られました・・・。
1とLの違いか・・・才能無いっすね(笑。
xna_08

で、真正面のスペースシップも味気ないので、さらにコードを追加しましょう。
例によって検索でUpdateメソッドを見つけましょう。
そして以下のコードを追加。

protected override void Update(GameTime gameTime)
{
// Allows the default game to exit on Xbox 360 and Windows
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds
* MathHelper.ToRadians(0.1f);
base.Update(gameTime);
}

この一行を追加するだけで、スペースシップがグルグル回るわけです。
面白いですね。
xna_09
次回はチュートリアル2を進めるつもりですが、いつになるかは未定。
このままやめる可能性も大(笑。
期待しないでください。

アディオス。

Post to Twitter

, ,

  1. No comments yet.
(will not be published)