| 0からのゲームプログラミング > 行列 |
| Back Next |
| 更新日 2004.04.24 |
| 行列 |
| 前回まではヘリコプターのみを表示させていましたが、今回は地面を新たに追加してみることにします。下のような地面を作成し、Xファイルで保存するときには
20 倍に拡大しています。 ダウンロード Ground.zip [ 16.8 KB ] 地面 (左:全体像 右:中央を拡大) |
![]() |
ZIPファイルを解凍して出来た Ground フォルダごと DataForWork フォルダ内に入れておき、以下のように、地面のコードを追加します。 Screen.h |
|
ScreenStage.cpp |
|
これで実行してみると、以下のようになります。 スクリーンショット |
![]() |
はい、ヘリが地面に埋まっています。(笑)イメージして頂いた通りになっていると思います。ヘリと地面を重ね合わせて描画しただけですから、このような結果になりますよね。 ◆ 行列 このヘリを移動させたりする為に、行列(マトリックス、matrix)を使います。2D編でも触れましたが、ここでは行列について深く考えず、DirectX で用意されている D3DXMATRIX 構造体 を使っていきます。 行列を使う準備として、以下のようにコードを加えます。 Screen.h |
|
ScreenStage.cpp |
|
ヘリ本体、プロペラ、地面、それぞれに対して D3DXMATRIX 構造体 を用意しています。コンストラクタでは、それぞれの変数に初期値として単位行列を格納しています。そして、描画するときには、ワールド・トランスフォームを行い、Xファイルを描画するように変更しています。 単位行列とは、行列の対角線上の成分がすべて 1 で、他の成分は 0 である正方行列であり、・・・云々かんぬん。とありますが、詳しくは数学の教科書等を参照して下さい。D3DXMATRIX 構造体の初期値は、単位行列を入れておけば問題ないです。D3DXMatrixIdentity 関数は、単位行列を作成する関数です。 ワールド・トランスフォームとは、モデル空間からワールド空間へ座標を変換する [ トランスフォーム、transform ] ことです。トランスフォームするには、IDirect3DDevice9::SetTransform メソッド を使います。 第1引数には、D3DTS_WORLD (ワールド・トランスフォーム) をセットし、第2引数には、D3DMATRIX 構造体へのポインタを渡します。 参考(順番にトランスフォームしていきます。) ・ワールド・トランスフォーム ( モデル座標 → ワールド座標 ) ・ビュー・トランスフォーム ( ワールド座標 → ビュー座標 ) ・射影・トランスフォーム ( ビュー座標 → 射影座標 ) ・ビューポート変換 ( 射影座標 → スクリーン座標 ) |
| 【スポンサード リンク】 |
| Back Next |
| 0からのゲームプログラミング > 行列 |