2016年07月08日

AABB

ボーンベースの動的AABBを作りたくて、あれこれ試行錯誤したけどうまく行かなくて結局普通のAABBにしたという話(開幕まとめ

AABBというのは、Axis Aligned Bounding Boxの略で、メッシュを構成する頂点座標のxyz成分の最大値と最小値からなる立方体(2Dなら矩形)です。
ゲームエンジンではオクルージョンカリングや、カメラカリングなどで用います。
衝突判定処理に使われることも多い(むしろこっちをメインに紹介されることが多い)ですが、うちはその辺はBulletにお任せしているので、衝突判定用のAABBを自前で作る必要はなくて、カリングのみが目的になります。
今回はアニメーションに対応したAABBを作成することが重要な目的でしたが、まあ結果は冒頭の通りです。
無念ぞ。

aabb.gif

動画のピンクの立方体は、初期姿勢の頂点から作成したAABBで、緑の点はボーン(ジョイント)です。
当初の思惑としては、緑の点を使ってピンクの立方体をごにょごにょすることで、アニメーションに対応したAABBを作成できるのではないかと思っていて、あれこれ試行錯誤していました。
で、そこそこいい所までは行ったのですが、ボーンだけではモデルの「厚み」を表現することができなくて、モデルをすっぽり包み込む立方体を作成するまでには至りませんでした。

厚み問題への対策として、メタボーンやリーフボーンを駆使するという若干力技なやり方を試してみました。
しかし、この実装はボーン行列の計算が嵩む上に、メタボーンの追加やリーフボーンを調整する手間が面倒くさくもあってだいぶ微妙でした。

他にはバウンディングスフィアと組み合わせて厚み解決済みのAABBを作成する方法を思いつきましたが、これも、ボーンの数だけ球の大きさを手打ちで設定しないといけないのが面倒くさ過ぎたので没にしました。
まあ、これに関しては実装するだけでも面倒だったのでやめたってのもありますねw

で、結局は初期姿勢のメッシュAABBをベースに、アニメーションで使用する空間を予め確保した固定サイズのAABBを用意するという(個人的に)昔ながらのやり方を採用することにしまして、AABBは一件落着とすることにしました。
固定サイズのAABBはモデルが巨大になるほどカリングの精度がザルになるという難点があるものの、ウラさんくらいの小さなモデルであればそこそこ使える無難な実装です(アニメーション次第なところもありますけど。

動的AABBは完全に没ということになりますが、ボーン関連の機能で今後に使えるものがいくつか作れたので、収穫はそこそこありました。
今回の試行錯誤でボーン周りの理解が深まったことも大きな収穫といえると思います。
おかげでIKと揺れモノの実装にもぼちぼち取り掛かれそうです。

今回はこんなところです。
次はオクルージョンクエリやらカメラの視推台カリングの実装に進んでいこうと思います。
ではまた。
posted by gency at 23:04| Comment(0) | 3DProgramming