Cross概要ゲームダウンロードお問い合わせホーム実験と実装と14.Dx12、Dx11共有計算ライブラリ2016/8/7実験と実装と14.Dx12、Dx11共有計算ライブラリTweetShareDirectXアプリが利用する計算ライブラリとして、「DirectXMath」というライブラリがあり、BaseCrossはその計算関数を使用しています。「DirextXMath」を使ったBaseCrossライブラリは「Dx12」「Dx11」どちらからでも利用可能であり、共有プロジェクト「DxLib」に含まれます。「MathVector.h」「MathVectorEX.h」「MathExt.h」「MathExtEX.h」の4ファイルです。この記事は、コミット「Dx12版のウインドウ作成」から、コミット「Dx11版ウインドウ作成と共有ファイルの追加」の間の作業です。GitHubサイトhttps://github.com/WiZFramework/BaseCrossを参照して下さい。「MathVector.h」にふくまれるものこのヘッダには、「Vector2構造体」「Vector3構造体」「Vector4構造体」、そして未完成ですが「XMVector構造体」があります。その名のとおり、ベクトル演算をするクラスです。Vector2、Vector3、Vector4に共通することを説明します。「DirectXMath」はベクトル演算用のデータ型として「XMVECTOR」という特殊な型を使用します。このデータ型は、32ビットアラインメントされ、そのままハードウェアレジスタにマップされます。そのため、「XMVECTOR」のデータをC++から直接変更はせずに、ロード、あるいはストア系の関数を使って通常データとやり取りします。「XMVECTOR」とやリとりできる型として、XMFLOAT2、XMFLOAT3、XMFLOAT4があります。予想どおりXMFLOAT2はfloat型のx,yを保持する型で、XMFLOAT3はx,y,z、XMFLOAT4はx,y,z,wとなります。「DirectXMath」の関数は、例えば3Dベクトルの長さを求める「XMVector3Length関数」は、「XMVECTOR」を引数に取り「XMVECTOR」を返します。//lenがベクトルの長さこのように、XMVector3Length関数に渡す前に、「XMVECTOR型にロード」し、結果も、「XMFLOAT3型にストア」する、という手順を踏まなければいけないので、これを何とか簡略化する方法はないかと考えたわけです。それで、以下のような構造体を考えました。};ほかにも値代入のコンストラクタとかは当然あるわけですが、XMVECTORとのやり取りを部分だけ抜粋です。基本的にこのクラスは*this(つまりx,y,z)に値を保存しておき、必要な時に計算関数を動かし、場合によっては、*thisを書き換えるという構造体です。};のように書けるわけです。XMVECTOR()」が動きます。other)」のコンストラクタが動き、その「x」を参照できます。other)」が動き、*thisに代入されます。このような設計にしておくと、XMVECTORとのやり取りをコンストラクタやキャスト演算子、代入の多重定義にまとめられます。結果として、Vector3型は以下のような記述ができるようになります。V3.Normalize();このように「V3.Length()」も「V3.Normalize()」も中でSSE2に最適化された計算ライブラリが動いているのですが、外からはわかりません。(わからなければいいってもんでもないですが、少なくともロードとストア地獄からは解放されます)Vector2、Vector3、Vector4各構造体には「DirecctXMath」の関数がラッピングされています。ほかの計算ライブラリでそろっているものはおおむね網羅していると考えていただいて結構です。ベクトル処理に必要と思われる計算はほぼそろってます。教育的側面からすれば、例えば「内積」は、自分で書いてこそ勉強にはなると思います。計算して出した「内積」を「どう使うのか」も重要です。ライティングや衝突判定など内積を使う局面はいたるところにあります。その部分の理解なくして「内積」や「外積」の計算方法を暗記してもあまりいいことはないと思います。いうわけで、「MathVector.h」に含まれる関数群をぜひ一通り目を通してもらえればいいかと思います。「MathVectorEX.h」にふくまれるものVector2、Vector3、Vector4の「namespace版」は「MathVectorEX.h」に含まれます。「namespace版」というからには、名前が必要ですが、Vector2は「Vector2EX」、Vector3は「Vector3EX」、Vector4は「Vector4EX」という「namespace」です。構造体版との違いは「ただの関数群」ということです。-V2);単にV1とV2と間の距離が必要なだけなら、Vector3オブジェクトはいらないので上記のように書けるのです。その局面局面で、オブジェクトを作成しておいたほうがいいと思えば構造体版を使えばいいし、計算だけすればいいのであればnamespace版を使用すればいいのです。そんな風に「Vector2、Vector3、Vector4」と「Vector2EX、Vector3EX、Vector4EX」が関係しています。「namespace版」にも構造体版同様の関数が実装されています。「MathExt.h」にふくまれるもの「MathVector」がベクトル演算構造体なのに対して、「MathExt.h」には「Plane(平面)」「Color4(色)」「Quaternion(クオータニオン)」「Matrix4X4(4X4行列)」が構造体として実装されています。「Plane」「Color4」「Quaternion」は根っこにあるのは「XMVECTOR」なので、ベクトル構造体と同じです。XMVECTOR()」「代入演算子」に、ロードやストアは実装されています。「Matrix4X4」は「XMVECTOR」の代わりに「XMMATRIX」というデータ型を使います。扱い方は「XMVECTOR」と変わりません。XMVECTORが4つ配列化したものと考えられます。これも「XMVECTOR」同様、ロードやストアが必要です。これまで説明した方法で実装可能です。XMMATRIX()」「代入演算子」でロードトストアを実装しています。「MathExtEX.h」にふくまれるもの「MathExt.h」がクオータニオンや行列の構造体なら、「MathExtEX.h」はこれらのnamespace版として対になってます。使い方はベクトルと同じです。その局面局面で、構造体版を使うかnamespace版を使うことを選択できます。これまで、計算系の構造体やnamespaceの使い方を説明してきました。これはどこの計算ライブラリもそうですが、実装されてるのは「基本的な計算の部分」だけです。実際にゲームで利用するためには、それらを組み合わせて「生きた計算」にする必要があります。それらはゲームごとに違うものであり、BaseCrossもほかのフレームワークも、どんなに「簡単に」始められても、最後はゲームごとの問題になります。「DxLib」共有プロジェクトに含まれるものには、これまで説明してきたもののほかに「XmlDoc.h/cpp」と「TransHelper.h」があります。「TransHelper.h」は次項で説明しますが、「XmlDoc.h/cpp」は「XMLの読み書き」を実装するライブラリであり、CSVやバイナリデータ読み込み同様、どこかで個別に説明します。「XmlDoc.h/cpp」を使うには、「MSXML」というマイクロソフト社のXML読み書き用のCOM(コンポーネントオブジェクトモデル)の理解が必要です。これはここで説明するには大きすぎるので、またの機会にいたします。次項は「TransHelper.h」に含まれる、おもに「衝突判定」の基本ライブラリを説明します。実験と実装とピックアップ記事2016/9/2244.プレイヤーの反発と追いかけるオブジェクト今回は前回のサンプルを少し機能を追加しまして、いろんなオブジェクトを追加しています。FullTuto...2016/9/2043.プレイヤーと固定ボックス前回更新から時間がたってしまいましたが、今回はフルバージョンチュートリアル003をアップしました。