TGWS>プログラミング>DirectX9>

カプセル型を描画してみる

何を作りたいのかが定まっていない人間が中途半端に何かを作ろうとするつまらないページです。
とりあえずVisual C++ 2008 Express EditionとDirectX 9.0 SDK Update (Summer 2004)なー。

目的

ゲームにおいて、特にアクションゲームの類において、当たり判定とはきわめて重要なものである。

ここで、人体を例にとって見ると、人体は筒状の構成要素の集合で近似できる。
“筒状”といえば、簡単に言えば円柱のことだが、円柱の当たり判定は厳密に行おうとすると非常に難しい。
しかし、その両端に、円柱と同じ直径を持つ半球を2つ連結して“カプセル型”にすると、その当たり判定は線分との距離の判定として取り扱える。
つまり、カプセル型は非常に優れた当たり判定形状なのである。

しかし、その優れた当たり判定も正しく利用されなければ意味を成さない。
特によく見かけられる失敗として、そもそも当たり判定の場所が正しくないというケースがある。
これではどんなに優れた判定を正しくプログラムしたとしても正しく判定されることは永久にありえない。
この問題を解消する効果的な方法は、当たり判定を可視化することである。

できたやつ

ということで、カプセル型を一発で描画してくれる関数がほしいなーってことになったわけです。
とりあえず作ってみたんですが、説明とかが面倒なんでソース置いときます。
CCapsuleMesh::DrawCupsule関数を呼び出して使います。

カプセル型の描画結果
▲こんな風に描画される

せっかくなので当たり判定に使えそうなクラス作ってみた

CCollisionHelper::IsNearSegmentSegment(カプセル1の一方の半球の中心, カプセル1の他方の半球の中心, カプセル2の一方の半球の中心, カプセル2の他方の半球の中心, カプセル1の半径+カプセル2の半径)
で当たり判定ができるはず。
計算は線分と線分の距離の記事を元にしました。

2012/01/19 DistancePointSegmentSqが間違った値を返すことがあるバグを修正。