XNAにおける3Dゲーム描画設計 (描画に対してまず最初に理解すること)
3/8にてモデル情報の設定が行われたので、次はいよいよ描画です。ちなみに、スプライト情報の方も今後検討したいと思います。
…と思ったのですが、画面にモデルを描画をするには先に知っておくことがありました…(^^;
さて、1/7にてXNAのフレームワークでは描画イベントはGame.Draw関数ということを説明しましたが、描画を行うためにはモデル情報の他に理解しておくこと、また検討することがあります。
【座標系について】
「サンプルソース(2008.02.29.zip)」では説明もなくモデルファイルのサンプルを挙げましたが、このモデルファイルはMetasequoiaにて作成しており、且つXファイル形式と出力する際、一般的に「右手座標系」と呼ばれている座標系にて保存しています。
この図ではMetasequoiaのXファイル形式に保存する際は、座標軸を「Direct3D」としています。これは右手座標系を表わします。
(ついでに保存サイズを1.0の等倍としています。こうしないと座標情報が縮小された位置の考えとなってしまうためです)
XNAの世界ではこの右手座標系をアーキテクチャとしているので、必ずこの座標系で処理を行う必要があります。
【座標変換情報】
描画を行うには3D空間の座標を2Dであるディスプレイの座標に変換を行う必要があり、この変換を行わないとモデルの情報を画面に出力できません。
座標変換を行うために必要な情報には「ワールド行列」「ビュー行列」「投影行列」というものが必要で、この○○行列という情報はXNAではMatrixクラスにて実現が行えるようになっています。
また、この座標変換情報以外にも、奥行のフェードアウト情報となる「フォグ情報」等もありますが、ここではシンプルに上述の内容のみを使って行きたいと思います。
(ここでは余談なのですが、XNAは殆んどDirect3Dのラッパーに近いので、レンダリングの追求を行えば、Level of Detailやスプライトの深度バッファ等の高次元の3D描画の情報等を操作することが可能のようです。私は使ったことありませんが…)
まずはこのような事項があることを理解しておきます。上述の詳細はインターネットでキーワード検索すると、幾らでも情報が入手できると思うので、XNAで描画を行うにはまずはこのことを理解しておけば良いかと思います。
◇ ◇ ◇
次に検討しておくことですが、3D空間の表現には奥行があったりするので、座標変換のために座標変換情報を最初に決めておく必要があります。
これら情報はゲーム実行中に任意に変更は可能ですが、まず最初にどのような空間にどのように表示するというのは必ず必要となるので、この座標変換について検討したいと思います。
「サンプルソース(2008.02.29.zip)」では、これら情報はDrawManagerクラスに格納されており、それぞれ「ワールド行列(m_world)」「ビュー行列(m_camera)」「投影行列(m_projection)」)となっています。(ビューがm_cameraなのは一般的にこのビューをカメラに準えているからです(^^;)
初期化タイミングはゲームのインスタンスが生成された直前に、Globalクラスの初期化時(Initialize関数内)にて、DrawManager.SetCoodinate関数を呼び出して、これら座標変換情報の設定を行なっています。
[視点行列]
Matrix.CreateLookAt関数にて、第1引数にてカメラを置く座標、第2引数にてカメラの見ている先の座標、第3引数は一般的な作法として設定しています。
カメラは中心から前方左上辺りに置き(座標:1000, 1000, 500)、オブジェクト(Player)の映っている所がカメラの先(座標:0, 0, 0)となっています。
[射影行列]
Matrix.CreatePerspectiveFieldOfView関数にて、第1引数にて視野角、第2引数にてアスペクト比、第3引数にてニアクリップ面の距離、第4引数にてファークリップ面の距離を設定しています。
視野角はカメラから見た画面の広がりとなり、角度が広がると画面に映すものが広がります。ここでは奥行を表すために45度にしています。
XNAでは角度を表す単位はラジアンとなります。XNAのMathHelper.ToRadians関数を用いると角度からラジアンに変換できます。オーバーヘッドはどの程度かは不明ですが…
アスペクト比は殆どお作法として設定しています。画面の幅÷高さが一般的と言われています。ここではSetCoodinate関数の引数で渡ってくる、ゲーム画面のサイズを基に演算しています。この情報はゲームのインスタンスが生成される際に取得が行えます。
ニアクリップ、ファークリップは奥行を表現する前後の領域となります。これは奥の描画をどこからどこまでにするかという情報です。奥行が必要であれば、ファークリップを大きな値にします。
[ワールド行列]
これについては次回の描画の際に説明します。
◇ ◇ ◇
今回はかなりの文章量となってしまいましたが、サンプルソースを基に、「まぁ、このようなことをしているんだな」程度に汲み取ってもらえればと思います。
ポイントは視点行列のカメラの座標のみといった所でしょうか…
次回はこれら座標変換情報を用いてモデルの描画(今度こそ画面に描画?)について説明したいと思います。
…と思ったのですが、画面にモデルを描画をするには先に知っておくことがありました…(^^;
さて、1/7にてXNAのフレームワークでは描画イベントはGame.Draw関数ということを説明しましたが、描画を行うためにはモデル情報の他に理解しておくこと、また検討することがあります。
【座標系について】
「サンプルソース(2008.02.29.zip)」では説明もなくモデルファイルのサンプルを挙げましたが、このモデルファイルはMetasequoiaにて作成しており、且つXファイル形式と出力する際、一般的に「右手座標系」と呼ばれている座標系にて保存しています。
この図ではMetasequoiaのXファイル形式に保存する際は、座標軸を「Direct3D」としています。これは右手座標系を表わします。
(ついでに保存サイズを1.0の等倍としています。こうしないと座標情報が縮小された位置の考えとなってしまうためです)
XNAの世界ではこの右手座標系をアーキテクチャとしているので、必ずこの座標系で処理を行う必要があります。
【座標変換情報】
描画を行うには3D空間の座標を2Dであるディスプレイの座標に変換を行う必要があり、この変換を行わないとモデルの情報を画面に出力できません。
座標変換を行うために必要な情報には「ワールド行列」「ビュー行列」「投影行列」というものが必要で、この○○行列という情報はXNAではMatrixクラスにて実現が行えるようになっています。
また、この座標変換情報以外にも、奥行のフェードアウト情報となる「フォグ情報」等もありますが、ここではシンプルに上述の内容のみを使って行きたいと思います。
(ここでは余談なのですが、XNAは殆んどDirect3Dのラッパーに近いので、レンダリングの追求を行えば、Level of Detailやスプライトの深度バッファ等の高次元の3D描画の情報等を操作することが可能のようです。私は使ったことありませんが…)
まずはこのような事項があることを理解しておきます。上述の詳細はインターネットでキーワード検索すると、幾らでも情報が入手できると思うので、XNAで描画を行うにはまずはこのことを理解しておけば良いかと思います。
◇ ◇ ◇
次に検討しておくことですが、3D空間の表現には奥行があったりするので、座標変換のために座標変換情報を最初に決めておく必要があります。
これら情報はゲーム実行中に任意に変更は可能ですが、まず最初にどのような空間にどのように表示するというのは必ず必要となるので、この座標変換について検討したいと思います。
「サンプルソース(2008.02.29.zip)」では、これら情報はDrawManagerクラスに格納されており、それぞれ「ワールド行列(m_world)」「ビュー行列(m_camera)」「投影行列(m_projection)」)となっています。(ビューがm_cameraなのは一般的にこのビューをカメラに準えているからです(^^;)
初期化タイミングはゲームのインスタンスが生成された直前に、Globalクラスの初期化時(Initialize関数内)にて、DrawManager.SetCoodinate関数を呼び出して、これら座標変換情報の設定を行なっています。
[視点行列]
Matrix.CreateLookAt関数にて、第1引数にてカメラを置く座標、第2引数にてカメラの見ている先の座標、第3引数は一般的な作法として設定しています。
カメラは中心から前方左上辺りに置き(座標:1000, 1000, 500)、オブジェクト(Player)の映っている所がカメラの先(座標:0, 0, 0)となっています。
[射影行列]
Matrix.CreatePerspectiveFieldOfView関数にて、第1引数にて視野角、第2引数にてアスペクト比、第3引数にてニアクリップ面の距離、第4引数にてファークリップ面の距離を設定しています。
視野角はカメラから見た画面の広がりとなり、角度が広がると画面に映すものが広がります。ここでは奥行を表すために45度にしています。
XNAでは角度を表す単位はラジアンとなります。XNAのMathHelper.ToRadians関数を用いると角度からラジアンに変換できます。オーバーヘッドはどの程度かは不明ですが…
アスペクト比は殆どお作法として設定しています。画面の幅÷高さが一般的と言われています。ここではSetCoodinate関数の引数で渡ってくる、ゲーム画面のサイズを基に演算しています。この情報はゲームのインスタンスが生成される際に取得が行えます。
ニアクリップ、ファークリップは奥行を表現する前後の領域となります。これは奥の描画をどこからどこまでにするかという情報です。奥行が必要であれば、ファークリップを大きな値にします。
[ワールド行列]
これについては次回の描画の際に説明します。
◇ ◇ ◇
今回はかなりの文章量となってしまいましたが、サンプルソースを基に、「まぁ、このようなことをしているんだな」程度に汲み取ってもらえればと思います。
ポイントは視点行列のカメラの座標のみといった所でしょうか…
次回はこれら座標変換情報を用いてモデルの描画(今度こそ画面に描画?)について説明したいと思います。
コメント
コメントの投稿
« 昔のゲームの想い出 [0028] 「バルトリック」 [ジャレコ] [1986] [アーケード] l Home l 昔のゲームの想い出 [0027] 「セクターゾーン」 [日本物産] [1984] [アーケード] »