バウンディングボリューム(BV)
MascotCapsule エクステンションでは各種バウンディングボリュームの作成、移動を行うことができ、相互の衝突判定が可能となっています。また、デバッグ用にメッシュの作成および描画を行うことも可能です。
目次
- 1. バウンディングボリュームの作成
- 2. Shape の移動、回転
- 3. デバッグ用メッシュの描画
- 4. バウンディングボリューム同士の衝突判定
- 5. バウンディングボリュームおよびCollisionクラスの破棄
1. バウンディングボリュームの作成
バウンディングボリュームの作成には、IMICRO3D_mcx_xxxx_createx()を使用します(xxxxは、Shape名)。また、ここでは同時にデバッグ用メッシュの作成も行っています。この操作によりデバッグ用メッシュの描画が可能となります。
注意:
バウンディングボリューム に対応するデバッグ用メッシュの作成およびこの描画は、衝突判定領域の目視を目的としています。従ってデバッグ用メッシュは、描画速度よりも描画精度を優先し、多数の頂点を使用しています。
以下では、半径、高さを持つ円筒形の底面・上面に半円形をつけたカプセルを表す、バウンディングボリュームを作成しています。
&e );
{
また、Shapeの作成後に、その形状を設定する必要があります。
これには、IMICRO3D_mcx_xxxx_setx()を使用します。以下では、上記で作成したShapeの形状設定を行っています。
50, /* 半径 */
180, /* 高さ */
&e );
デバッグ用メッシュの作成には、IMICRO3D_mcx_DebugShapeRenderer_createx()を使用します。
メッシュに、ライトの設定や半透明の属性を付加することも可能です。これには、
IMICRO3D_mcx_DebugShapeRenderer_enableLightingx()
IMICRO3D_mcx_DebugShapeRenderer_enableTransparentx()
を使用します。
また、使い終わったメッシュは必ず破棄する必要があります。
これについては、「5. バウンディングボリュームおよびCollisionクラスの破棄」で説明します。
HI_TRUE );
HI_TRUE );
2.Shape の移動、回転
Shape の移動、回転にはIMICRO3D_mcx_Shape_setTransformx()を使用します。
これにより、Shape 座標からワールド座標への変換が行われます。
以下では、上記で作成したShapeの移動と回転を行っています。
IMICRO3D_Atrans3i_setIdentity( pMe -> pIM3D, &capsule_trans );
/*----- 回転行列の設定-----*/
IMICRO3D_Atrans3i_setRotateV( pMe -> pIM3D,
&rotation_axis,
-( pMe -> mc_data.angle ) );
/*----- capsuleの初期位置 -----*/
capsule_trans.m03 = pMe -> cxScreen;
capsule_trans.m13 = pMe -> cyScreen;
( 中略 )
/*----- shape座標をworld座標に変換 -----*/
IMICRO3D_mcx_Shape_setTransformx( pMe -> pIM3D,
&capsule_trans,
&e );
3. デバッグ用メッシュの描画
各 Shape に対応するデバッグ用メッシュを描画する際には、Shape に設定されたワールド座標への変換を取得する必要があります。このワールド座標への変換の取得にはIMICRO3D_mcx_DebugShapeRenderer_renderShapex()を使用します。
またメッシュの色は、IMICRO3D_mcx_DebugShapeRenderer_setColor()で設定できます。
0x00ff0000);
IMICRO3D_mcx_DebugShapeRenderer_renderShapex( pMe -> pIM3D,
&pMe -> mc_data.render,
( mcxShapex* )pMe -> mcx_data.pcapsule,
&e );
4.バウンディングボリューム同士の衝突判定
衝突判定には、まずCollisionクラスの作成を行う必要があります。これには、
IMICRO3D_Collision_createx()を使用します。Collisionクラスを作成後、IMICRO3D_mcx_Collision_isHitShapeTo Shapex()を使用することでShape同士の衝突判定が行えます。
また、作成したCollisionクラスは、使用後に必ず破棄する必要があります。これについては、「5. バウンディングボリュームおよびCollisionクラスの破棄」で説明します。
pMe -> mcx_data.pcollision = IMICRO3D_mcx_Collision_createx( pMe -> pIM3D,
&e );
{
hi_sint32 e;
hi_bool isHit_c = HI_FALSE;
/*----- 当たり判定 -----*/
isHit_c = IMICRO3D_mcx_Collision_isHitShapeToShapex( pMe ->pIM3D,
( mcxShapex* ) pMe -> mcx_data.pbox,
( mcxShapex* ) pMe -> mcx_data.pcapsule,
&hitData,
&e );
{
( 中略 )
}
衝突・交差が起こった場合は、戻り値にHI_TRUEを、起こらなかった場合は、戻り値にHI_FALSEを返します。
5.バウンディングボリュームおよびCollisionクラスの破棄
使用し終わったShape、メッシュ、およびCollisionクラスは、必ず破棄する必要があります。これには、
IMICRO3D_mcx_xxxx_destroyx()
IMICRO3D_mcx_DebugShapeRenderer_destroyx()
IMICRO3D_mcx_Collision_destroy()
を使用します。以下では、カプセル等の破棄を行っています。
IMICRO3D_mcx_DebugShapeRenderer_destroyx( pMe -> pIM3D,pMe -> mcx_data.pmcxDsr_capsule );
IMICRO3D_mcx_Collision_destroyx( pMe -> pIM3D, pMe -> mcx_data.pcollision );

