BaseCrossDx12ドキュメント

DirectXMathと計算ライブラリ

 BaseCrossDx12には、独自の計算ライブラリがあります。独自と言いましても、どちらかというと、MS社のDirectXMathを利用しやすくする、お助け的なライブラリです。この項では、その仕組みと使い方を紹介します。
 ソースコードはBaseLibフィルタBasic/Headersフィルタの中のBaseMath.hBaseMathInc.hです。bsmネームスペース内にあります。(今後はこのライブラリをbsmライブラリではとかbsmではといった記述にします)。
 ところでDirectXMathは、ベクたーはXMVECTOR構造体、行列はXMMATRIX構造体を使います。bsmでは主にこの2つの構造体に対するライブラリです。
 しかしながら、XMVECTOR、XMMATRIX構造体は、扱いが複雑です。ですので、通常はデータはXMFLOAT3、XMFLOAT4、XMFLOAT3X3、XMFLOAT4X4構造体にとっておいて、計算するときだけXMVECTOR、XMMATRIXにロードします。そうして計算後、XMFLOAT3、XMFLOAT4X4などにストアします。
 しかし、この手順が結構厄介です。通常、ロード(Load)、計算(関数呼び出し)、ストア(Store)の手順を踏む必要があります。そこでbsmライブラリは、この処理を簡略化するべく用意しました。
 例えば、あるクォータニオン変数を、毎ターン時にちょっとずつ回転するという処理を考えてみましょう。すると以下のようなコードが考えられます。
 まず、以下のような、オブジェクト内のメンバ変数があったとします。
class Hoge{
	XMFLOAT4 m_quaternion;
};
 そして、構築時(create時)に以下のように初期化します。
	XMVECTOR quat = XMQuaternionIdentity();
	XMStoreFloat4(&m_quaternion,quat);
 そして、各ターンのupdate時に、以下のように回転を追加します。
	//回転軸
	XMFLOAT3 axisFVec(1.0f,1.0f,0.0f);
	XMVECTOR axisVec = XMLoadFloat3(&axisFVec);
	//回転軸に従って0.001f回転するクォータニオンを作成
	XMVECTOR spanQt = XMQuaternionRotationAxis(axisVec,0.001f);
	//計算用にm_quaternionをLoad
	XMVECTOR baseVec = XMLoadFloat4(&m_quaternion);
	//回転を追加
	baseVec =  XMQuaternionMultiply(baseVec,spanQt);
	//m_quaternionにstore
	XMStoreFloat4(&m_quaternion,baseVec);
 このようにする必要があります。
 もちろん、XMVECTOR変数を、メンバとして持っておくとか、最適化はあるかと思いますが、XMVECTOR変数は保存するメモリに制約があったりします。ですのでXMFLOAT3とかXMFLOAT4で持っておくほうが安全です。
 そこで、bsmライブラリでは、XMFLOAT3やXMFLOAT4を継承して新たな型を作り、XMVECTOR変数とのやり取りを簡単にしています。上記の例だと以下のように書けます。
 まず、データ変数です。
class Hoge{
	bsm::Quat m_quaternion;
};
 そして、Create時の処理です。
	m_quaternion = XMQuaternionIdentity();
 Update時の処理です。
	bsm::Quat spanQt(Vec3(1.0f, 1.0f, 0.0f), 0.001f);
	m_quaternion *= spanQt;
 これで終わりです。この後はbsm::Quat型m_quaternionを描画用に使えます。
 bsmライブラリを読んでいただくとわかると思いますが、bsm::Quatbsm::Vec3XMFLOAT3やXMFLOAT4を継承して作られた型です。そしてXMVECTOR型に変換(Load)したり、また戻したり(Store)の処理を内部でやっています(コンストラクタやキャスト処理、operator演算などを使ってます)。ですので、XMQuaternionRotationAxis()関数などにも、直接渡すことができるのです。以下に、bsmの型とDirectXMathの型の関係について述べます。
bsm型名 継承元 XM型 Load Store 備考(演算の意味)
Vec2 XMFLOAT2 XMVECTOR XMLoadFloat2 XMStoreFloat2 ベクトル演算
Vec3 XMFLOAT3 XMVECTOR XMLoadFloat3 XMStoreFloat3 ベクトル演算
Vec4 XMFLOAT4 XMVECTOR XMLoadFloat4 XMStoreFloat4 ベクトル演算
Quat XMFLOAT4 XMVECTOR XMLoadFloat4 XMStoreFloat4 クォータニオン演算
Mat3x3 XMFLOAT3X3 XMMATRIX XMLoadFloat3x3 XMStoreFloat3x3 行列演算
Mat4x4 XMFLOAT4X4 XMMATRIX XMLoadFloat4x4 XMStoreFloat4x4 行列演算
Col4 XMFLOAT4 XMVECTOR XMLoadFloat4 XMStoreFloat4 Vec4のエイリアス
Pt2 XMFLOAT2 XMVECTOR XMLoadFloat2 XMStoreFloat2 Vec2のエイリアス
Pt3 XMFLOAT3 XMVECTOR XMLoadFloat3 XMStoreFloat3 Vec3のエイリアス
Plane4 XMFLOAT4 XMVECTOR XMLoadFloat4 XMStoreFloat4 Vec4のエイリアス
 ※なお、使える演算子などはソースコードを参照ください。
 bsmライブラリは、bsm型を強制するものでもありません。DirectXMathの手順に従ってXMLoadFloat3などを使うソースと共存できます。またそれらの型は、いつでもbsm型に変換することもできます。
 使用している計算関数を明示化する必要がある場合もあるでしょう。bsmライブラリが、ゲーム制作の多少なりとも手助けになれば幸いです。