機能紹介~ObjectModelクラス~
どうも!Senkokusyaです!
はい。がっつり技術系の記事になります~
自分がDirectXTKを用いて3Dゲームを制作する際に必ずといっていいほど使うクラスがいくつかあります。今回はそのうちの一つである
・モデル描画を簡略化するラッパークラス
の解説になります!
最後まで見ていただけると嬉しいです!
では。
1.開発経緯
DirectX11だと超難しいモデル描画周りを少し使いやすくしてくれるライブラリ、それがDirectXToolKit(以下、DirectXTK)。
それを用いて描画をしようとすると下のようなコードになる。
これでもかなり簡略化しており、3D空間におけるカメラの情報はカメラクラスにまとめており、シェーダの情報はToolKitのEffectFactoryを用いている。
しかし、いくらToolKitが簡略化したとはいえ、現状では各クラスに座標だったり拡大率だったりをもたせなければならない。そうなるとクラス内の情報が"モデルの情報"なのか"クラスとして必要な情報"なのかがわからなくなってしまう。当然コードの可読性も落ちてしまうし、バグの原因となるだろう。
そこで開発したのが今回解説をおこなうObjectModelクラスとなる。
2.機能
始めにObjectModelクラスを用いた際、どれほどモデル描画が楽になったかを見てもらう。
これである。ものすごく簡略化されていることがわかるだろうか。
モデルの読み込みにResourceManagerを用いているが、1.の時より明らかにソース量が減っている。何を行ったかを順番に解説していく。
始めに、モデル描画に必要な情報を全てObjectModelクラスにまとめた。
座標や拡大率、描画に必要なEffectFactoryやSpriteBatchをまとめたのである。又、Matrix型の変数はそれぞれFloat型、Vector3型の変数を別途用意してある。これはDEBUG時に見やすくするためである。
このようにまとめることでこれを所持しているクラスは座標や拡大率などのモデルの情報とごちゃごちゃになることがない。
アクセサを用いらなければアクセスすることができないからである。
次にコンストラクタを見てもらいたい。
何やらいろいろ書いてあるが、注目する点は一番下である。
ここで座標を原点、拡大率を等倍に設定することで
"設定し忘れてモデルが描画されない"
というミスが起きないようにしている。
こうすることで、万が一モデルが描画されなかった場合
"モデルの読み込みに問題があるのか"
"モデルの情報に問題があるのか"
といった問題を前者のみに絞り込んで調べることができる。
3.派生
自分はこのクラスをさらに継承を用いて派生し、
"AABBの当たり判定を持ったクラス"
"Sphereの当たり判定を持ったクラス"
をそれぞれ開発した。
しかし、ここでは解説はしない。
なぜならMVCアーキテクチャーという考え方を壊す仕組みであるからだ。
だが、モデルの拡大率を利用する今回の設計上、このように作成したほうが後々にソースが見やすくなると思ったため、自分は作成した。
終了!このシリーズはいくつか続きます~
多分次はResourceManagerあたりをやるのかな…?
ではでは。