2008/9/16 Na-7
 

技術資料一覧に戻る

 

3Dモデルの前面にスプライトを描画する

 

注意 この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。

この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。

 

 

◎使用ツール

ツール名 入手元
XNA2.0(XNA GameStudio 2.0:ゲーム開発用フレームワーク) http://msdn.microsoft.com/ja-jp/xna/default.aspx
ACL(Animation Component Library:アニメーション再生用ライブラリ) http://www.codeplex.com/animationcomponents/Thread/View.aspx?ThreadId=19730
XNA2.0用の公式版は存在しないため、上記Discussionsに記載されている
http://www.laterminal.net/xna/AnimationComponentDLL.rarを使用した

 

◎問題点

ゲームには、スコア、メッセージ、各種パラメータ、外枠など、常に3Dモデルの手前(最前面)に表示したいスプライト(2Dの絵や文字)がある。
しかし、ACLで描画した3Dモデルと同じ位置にスプライトを描画すると、3Dモデルの背面に隠れてしまう。

 

◎解決方法(概要)

ACLによって3Dモデルが自動的に描画されているが、これを停止し、3Dモデルの描画命令を明記することとする。
そうすると、自分で描画するタイミングを制御できるようになるので、3Dモデルを描画してから最後にスプライトを描画することとする。

 

◎解決方法(詳細)

1.ACLの ModelAnimator を作成後、animator.Visible = false; として非表示としておく。

2.Draw() 内では、animator.Draw(gameTime);  として3Dモデルの描画を行う。

3.3Dモデルの描画後に、スプライトの描画を行う。

 

◎サンプルコード

protected override void LoadContent()
{

// 3Dモデルの呼び出し
testModel = Content.Load<Model>(" ");

// ModelAnimatorを追加
animator = new ModelAnimator(this, testModel);
animator.World =
Matrix.Identity;
animator.Enabled =
true;
animator.Visible =
false; // 非表示としておき、Draw()内で自力で描画する

}

protected override void Draw(GameTime gameTime)
{

// ワールド座標変換指定
animator.World = 〜 ;

// ACLによる描画実行
animator.Draw(gameTime);

// スプライトバッチ開始(AlphaBlendとSaveStateは殆どのゲームで必要)
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.FrontToBack, SaveStateMode.SaveState);

spriteBatch.DrawString( 〜 );

spriteBatch.Draw( 〜 );

// スプライトバッチ終了
spriteBatch.End();

}

※スキンアニメーションに必要なコードを全て記載しているわけではない。
※スキンアニメーションについては「XNA2.0でスキンアニメーション」を参照。

 

◎補足

上記の方法を使用せずに、spriteBatch.Begin() SpriteSortMode spriteBatch.Draw() の layerDepth (配置レイヤー)を調整したり、spriteBatch を複数作成することによって前面描画できないかと試してみたが、無駄であった。ACLの自動描画機能は、Draw()関数完了後に描画していると思われる。

 

inserted by FC2 system