前回まで Bullet Physics の基本的な演算対象の登録方法を見てきました。
実はまだ結果を取得して描画する部分を明らかにしていません。
ということで、今回は Bullet Physics の結果を取得する方法を明らかにして
ついでに簡単なシミュレーションゲームを構想して物理エンジン入門講座を締めくくりたいと思います。
突然ですが麻雀ってかなり楽しいゲームなんですよ、未だにすぐ点数でてきませんが…
はい、では次から本題に入りますね。
さて、半年以上前のことですが 034話 の最後に
「物理エンジンの講座の時に麻雀パイを使用してみようかなぁ…」なんて書いていました。
この言葉に従い麻雀台シミュレータを作ってみようと思います。
描画についての話に戻します。
これまでは 037話 で紹介した btIDebugDraw クラスを継承する
DebugDraw クラスを使って描画していました。
描画原理として、こちらで用意したライン描画関数をこのクラスが内部で呼ぶ形式でした。
今回は逆に、Bullet Physics 側から姿勢行列や頂点位置を取得して描画します。
まず現在わかっている描画位置の取得方法をまとめてみましょうか。
これまでの勉強で衝突判定用のシェイプや剛体、ソフトボディなどを作っては力学世界へ登録していました。
登録した順番にインデックスが振られているという位の認識はあったと思います。
そのインデックスから登録したオブジェクトへのアクセス子を取り出すコードをまず確認してみましょう。
ついでに姿勢情報を取り出すコードがこちら↓
…という風に、力学世界に登録しているすべてのオブジェクトの姿勢情報を
btTransform クラスとして取得することができます。
座標系は Y Up の右手座標系です。DirectX と計算を合わせるならばZ軸の符号を逆転させる必要があります。
ソフトボディについては頂点ごとに座標、法線の情報などがほしいですね。
どうやって取得するのか確認してみましょう。
経験的に、こういったものはだいたい内部にノード配列を持っているものです。
ノードの定義を探してみるとありました、定義は次の通り↓
頂点座標と法線のほか、速度や前のステップにおける頂点位置などかなり豊富な頂点情報が取り出せるようです。
btSoftBody は Node 配列を m_nodes として、メンバに持っていることをドキュメントから確認したので
この配列から頂点データ一式を取り出すことができるか試してみましょう。
具体的に CreatePAtch で四角い布を作り、そのときの頂点座標、三角形を構成している3頂点の座標を取得してみましょう。
確認コードがこちら(5 x 5 で作っている点に注意してください。)↓
結果、頂点数 25, 三角形数 32 でした。
なるほど、これはわかりやすいですね。(わからない人は前回を読み直してください。)
インデックス配列も欲しいところですが、これは m_faces の3頂点のアドレスから作るほか無いみたいです。
まぁ基本登録時にこちらからインデックスバッファを与えることが多いので、OKとします。
これで、ソフトボディから頂点ごとの詳細な情報を取得する方法が確認できました。
描画に必要なオブジェクトの姿勢情報とソフトボディの頂点情報の取得方法がわかったところで
これを描画に使うゲームを作成してみましょう。
まずは、麻雀台シミュレータということで、どんなクラス構造にするか設計するところから始めてみましょう。
まずは、作成するゲームのイメージから入ります。
ここに示すオブジェクトが麻雀台の上にあるものです。
トンシーマット、点棒、サイコロ、場風を表すやつ、麻雀牌です。
実際は、牌については x4個、点棒については 1万が 4本、5千が 8本、千が 20本(16本)、百が 40本必要になります。
確認した物について、四角い剛体だけですので、Bullet の衝突判定用のオブジェクトとして用意するのは
btBoxShape と btStaticPlaneShape だけで良さそうですね。
ただし、忘れてはならないのが、人間の手です。
いえ、特に珍しいことではないです。最近の3D麻雀ゲームには手が登場します。
手については、全体を一つの剛体とするには無理があります。
指一本一本について、1,2,3関節まで曲がり、それぞれに四角柱のシェイプを必要とします。
また、指先の腹の部分についてはソフトボディが必要です。
う…、ちょっと話が込み入ってきましたね、詳細は新しく章を設けて対応したいと思います。
それでは次回を、お楽しみに!
2011/09/24 初記。
2011/10/15 更新。