~プログラミング~ DirectX 11で立体を表示しよう その1

C++言語でDirectX 11を使ったアプリケーションを開発してみよう。

 

前回までで簡単な三角形や四角形の表示が出来るようになりました。

いよいよ立体的な物体の表示に挑戦です。

 

先ずは3Dに不可欠な変換行列を用意するところから始めてみます。

DirectXMathライブラリの準備

DirectXMathライブラリは、ベクトルや行列などを構造体として定義してくれていたり、それらの演算を行う関数が定義されている計算ライブラリです。

 

3次元的な表示を行う上で必要となる便利な関数が用意されているので使えるように準備しておきましょう。

#include "DirectXMath.h"
using namespace DirectX;

ヘッダーファイル DirectXMath.h をインクルードします。

このライブラリはすべて DirectX という namespace のなかで定義されているので、using宣言を使用しておくと良さそうです。

座標空間を理解する

立体的なオブジェクトを作る時 x,y,z の3次元な座標でのデータを作っていきます。

けれど、最終的には2次元のモニタへ表示させるわけなので、3次元の座標空間から2次元の座標空間へ変換を行う必要があります。

さらに、データをより分かりやすく管理するためにいくつかの座標空間を使うが使われます。

ローカル座標

立方体のオブジェクトを作る事を考えた時、立方体の中心を原点 (0, 0, 0) とすると各頂点の座標が分かりやすくなります。

このようにして作られたデータはそのオブジェクト固有の座標系という事になり、ローカル座標と呼ばれます。

ワールド座標

オブジェクトをどの位置に配置するかを決める座標系です。

各オブジェクトの位置関係や大きさなどをこの座標系で管理していくことになります。

 

地図の上にビルや車を置いていくようなイメージでしょうか。

ビュー座標

カメラから見た時を基準にした座標系です。

ワールド座標ではビルや車などの3Dモデルだけではなく、どの位置からどの方向を見ているかというカメラの情報も管理していきますが、そのカメラを基準とした座標です。

 

ワールド座標が東西南北を基準にした地図だとしたら、ビュー座標は見る人の視点を基準に上下左右が決められたものというイメージです。

プロジェクション座標

ローカル座標・ワールド座標・ビュー座標はすべて3次元の座標でした。

プロジェクション座標は3次元のデータを2次元に投影した時の座標系です。

 

風景を写真に収めるイメージです。

変換行列を作る

座標空間の変換には4x4の行列 (Matrix) を使います。

ローカル座標で作られた3Dモデルはワールド座標に変換され、さらにビュー座標へ変換された後、プロジェクション座標へ変換されてモニタへ表示されます。

 

ローカル座標からワールド座標へ変換する行列 (worldMatrix)、

ワールド座標からビュー座標へ変換する行列 (viewMatrix)、

ビュー座標からプロジェクション座標へ変換する行列 (projMatrix) をそれぞれ作ってみます。

        XMMATRIX worldMatrix = XMMatrixTranslation( 0.0f, 0.0f, 0.0f );

        XMVECTOR eye         = XMVectorSet( 2.0f, 2.0f, -2.0f, 0.0f );
        XMVECTOR focus       = XMVectorSet( 0.0f, 0.0f,  0.0f, 0.0f );
        XMVECTOR up          = XMVectorSet( 0.0f, 1.0f,  0.0f, 0.0f );
        XMMATRIX viewMatrix  = XMMatrixLookAtLH( eye, focus, up );

        float    fov         = XMConvertToRadians( 45.0f );
        float    aspect      = m_Viewport.Width / m_Viewport.Height;
        float    nearZ       =   0.1f;
        float    farZ        = 100.0f;
        XMMATRIX projMatrix  = XMMatrixPerspectiveFovLH( fov, aspect, nearZ, farZ );

変換行列はXMMATRIXという構造体を使います。

 

worldMatrixは今回特に何もしていません。

XMMatrixTranslation関数は平行移動させる変換行列を作成しますが移動量は0で作っています。

 

viewMatrixXMMatrixLookAtLH関数で作成する事が出来ます。

カメラの座標、焦点の座標、カメラの上方向を示すベクトルを引数として指定します。

 

projMatrixXMMatrixPerspectiveFovLH関数で作成する事が出来ます。

縦方向の視野角、縦横比、一番近くのZ値、一番遠くのZ値を引数として指定します。