BaseCrossDx12ドキュメント
DirectXMathと計算ライブラリ
BaseCrossDx12には、独自の計算ライブラリがあります。独自と言いましても、どちらかというと、MS社の
DirectXMathを利用しやすくする、お助け的なライブラリです。この項では、その仕組みと使い方を紹介します。
ソースコードは
BaseLibフィルタの
Basic/Headersフィルタの中の
BaseMath.hと
BaseMathInc.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::Quatや
bsm::Vec3は
XMFLOAT3や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ライブラリが、ゲーム制作の多少なりとも手助けになれば幸いです。