CollisionIsHitData を用いた衝突判定
MCX Collision Package には衝突判定の詳細情報を受け取る構造体として mcxCollisionIsHitData 構造体および、mcxCollisionIsHitInfo 構造体が存在します。
目次
注意:本サンプルでは説明の都合上、描画に対する効率化を行なっておりません。特にバウンディングボリューム ( BV ) に対応するメッシュの描画は実行速度を低下させる恐れがあります。これはバウンディングボリュームに対する Mesh はあくまでもデバッグ用であり、描画速度よりも形状の精度を優先してあるためです。
mcxCollisionIsHitData は BVFigure と Shape の衝突判定の場合、 BVFigure がもつ バウンディングボリューム ( BV ) のうち Shape と衝突したものの個数と、さらに詳細な情報を持つ mcxCollisionIsHitInfo 構造体の配列を持ちます。mcxCollisionIsHitInfo 構造体は交点情報等の詳細な情報を保持します。また、衝突判定に用いられる関数によって保持する情報が変化します。
1. 衝突時の詳細情報の取得
衝突時の詳細情報を表す mcxCollisionIsHitData 構造体や mcxCollisionIsHitInfo 構造体に詳細な情報を受け取るためには、 mcx_Collision_isHitShapeToBVFigure 関数に引数として mcxCollisionIsHitData 構造体を渡す必要があります。ここでは一例として Capsule との衝突判定を示します。
* mcxCollisionf* collision;
* mcxCollisionIsHitDataf hitData;
* hi_bool isHit;
* hi_bool isAllHit = HI_TRUE;
*
* mcxSample_collisionObserver は各 Shape に対する
* collisionObserver 関数の配列
*/
/* BVFigure と Capsule の当たり判定 */
isHit = IMICRO3Dv4es_mcx_Collision_isHitShapeToBVFiguref (
pmcx -> pBvfig, isAllHit, &hitData, &pMe -> e );
mcxSample_collisionObserver_capsule ( pMe, hitData );
なお、衝突時の詳細情報は後述する mcxSample_collisionObserver 関数内で利用しています。
2. 衝突時の詳細情報の利用
本サンプルでは衝突時の詳細情報を利用する関数として mcxSample_collisionObserver 関数群を実装しており、これらの関数群内で衝突時の詳細情報を利用しています。これらの関数では mcxCollisionIsHitInfo 構造体のメンバである isHit を利用して実際に衝突したボーンを検出し、最初に検出されたボーンが Capsule 及び Sphere と衝突している場合は、 mcxCollisionIsHitInfo 構造体の isInvolved を利用し、該当するボーンが Shape に内包されているかを検出します。Ray と衝突している場合には mcxCollisionIsHitInfo 構造体の nfvInteresectPt を利用して、ボーンと Ray との交点情報を取得しています。
他の mcxCollisionIsHitInfo 構造体のメンバについては API リファレンス、並びに
他の詳細なドキュメントをご覧ください。
ここでは一例として、Capsule オブジェクトに対する collisionObserver 関数である mcxSample_collisionObserver_capsule 関数を示します。
* mcxCollisionHitInfo を利用した CollisionObserver
*/
void mcxSample_collisionObserver_capsule ( CBREWMAIN* pMe,
mcxCollisionHitInfof* hitInfo = hitData.hitInfo;
AECHAR szCAPSULE_fmt [] =
hi_uint32 i = 0;
/* 詳細情報の取得 */
for ( i = 0; i < pmcx -> boneNumber; i ++ ) {
/* Capsule に関する情報を文字列バッファへ登録 */
if ( hitInfo [ i ].isInvolved ) {
/* 最初に衝突した Bone の情報のみを登録 */
break;


