Japanese | English | Korean

Samples

バウンディングボリューム(BV)

MascotCapsule エクステンションでは各種バウンディングボリュームの作成、移動を行うことができ、相互の衝突判定が可能となっています。また、デバッグ用にメッシュの作成および描画を行うことも可能です。


目次




1. バウンディングボリュームの作成

バウンディングボリュームの作成には、IMICRO3D_mcx_xxxx_createx()を使用します(xxxxは、Shape名)。また、ここでは同時にデバッグ用メッシュの作成も行っています。この操作によりデバッグ用メッシュの描画が可能となります。

注意:
バウンディングボリューム に対応するデバッグ用メッシュの作成およびこの描画は、衝突判定領域の目視を目的としています。従ってデバッグ用メッシュは、描画速度よりも描画精度を優先し、多数の頂点を使用しています。


以下では、半径、高さを持つ円筒形の底面・上面に半円形をつけたカプセルを表す、バウンディングボリュームを作成しています。

pMe -> mcx_data.pcapsule = IMICRO3D_mcx_Capsule_createx( pMe -> pIM3D,
         pMe -> pAlc,
         &e );
if( e != mcx_NoException )
{
return HI_FALSE;
}

また、Shapeの作成後に、その形状を設定する必要があります。
これには、IMICRO3D_mcx_xxxx_setx()を使用します。以下では、上記で作成したShapeの形状設定を行っています。

IMICRO3D_mcx_Capsule_setx( pMe -> pIM3D,
   pMe -> mcx_data.pcapsule,
   50,        /* 半径 */
   180,      /* 高さ */
   &e );

デバッグ用メッシュの作成には、IMICRO3D_mcx_DebugShapeRenderer_createx()を使用します。
メッシュに、ライトの設定や半透明の属性を付加することも可能です。これには、

IMICRO3D_mcx_DebugShapeRenderer_enableLightingx()
IMICRO3D_mcx_DebugShapeRenderer_enableTransparentx()

を使用します。
また、使い終わったメッシュは必ず破棄する必要があります。
これについては、「5. バウンディングボリュームおよびCollisionクラスの破棄」で説明します。

pMe -> mcx_data.pmcxDsr_capsule =IMICRO3D_mcx_DebugShapeRenderer_createx( pMe -> pIM3D,
pMe -> pAlc, &e);
IMICRO3D_mcx_DebugShapeRenderer_enableLightingx( pMe -> pIM3D,
           pMe -> mcx_data.pmcxDsr_capsule,
           HI_TRUE );
IMICRO3D_mcx_DebugShapeRenderer_enableTransparentx( pMe -> pIM3D,
    pMe -> mcx_data.pmcxDsr_capsule,
    HI_TRUE );


2.Shape の移動、回転

Shape の移動、回転にはIMICRO3D_mcx_Shape_setTransformx()を使用します。
これにより、Shape 座標からワールド座標への変換が行われます。
以下では、上記で作成したShapeの移動と回転を行っています。

Atrans3i capsule_trans;

IMICRO3D_Atrans3i_setIdentity( pMe -> pIM3D, &capsule_trans );

/*----- 回転行列の設定-----*/
IMICRO3D_Atrans3i_setRotateV( pMe -> pIM3D,
     &capsule_trans,
     &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,
( mcxShapex* ) pMe -> mcx_data.pcapsule,
&capsule_trans,
&e );


3. デバッグ用メッシュの描画

各 Shape に対応するデバッグ用メッシュを描画する際には、Shape に設定されたワールド座標への変換を取得する必要があります。このワールド座標への変換の取得にはIMICRO3D_mcx_DebugShapeRenderer_renderShapex()を使用します。
またメッシュの色は、IMICRO3D_mcx_DebugShapeRenderer_setColor()で設定できます。

IMICRO3D_mcx_DebugShapeRenderer_setColorx( pMe -> pIM3D,
  pMe -> mcx_data.pmcxDsr_capsule,
  0x00ff0000);

IMICRO3D_mcx_DebugShapeRenderer_renderShapex( pMe -> pIM3D,
       pMe -> mcx_data.pmcxDsr_capsule,
       &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クラスの破棄」で説明します。

/*----- Collisionインスタンスの作成 -----*/
pMe -> mcx_data.pcollision = IMICRO3D_mcx_Collision_createx( pMe -> pIM3D,
           pMe -> pAlc,
           &e );
if( e != mcx_NoException )
{
return HI_FALSE;
}
mcxCollisionIsHitDatax hitData;
hi_sint32          e;
hi_bool             isHit_c = HI_FALSE;

/*----- 当たり判定 -----*/
isHit_c = IMICRO3D_mcx_Collision_isHitShapeToShapex( pMe ->pIM3D,
pMe -> mcx_data.pcollision,
( mcxShapex* ) pMe -> mcx_data.pbox,
( mcxShapex* ) pMe -> mcx_data.pcapsule,
&hitData,
&e );
if(isHit_c == HI_TRUE)
{
( 中略 )
}

衝突・交差が起こった場合は、戻り値にHI_TRUEを、起こらなかった場合は、戻り値にHI_FALSEを返します。



5.バウンディングボリュームおよびCollisionクラスの破棄

使用し終わったShape、メッシュ、およびCollisionクラスは、必ず破棄する必要があります。これには、

IMICRO3D_mcx_xxxx_destroyx()
IMICRO3D_mcx_DebugShapeRenderer_destroyx()
IMICRO3D_mcx_Collision_destroy()

を使用します。以下では、カプセル等の破棄を行っています。

IMICRO3D_mcx_Capsule_destroyx( pMe -> pIM3D,pMe -> mcx_data.pcapsule );
IMICRO3D_mcx_DebugShapeRenderer_destroyx( pMe -> pIM3D,pMe -> mcx_data.pmcxDsr_capsule );
IMICRO3D_mcx_Collision_destroyx( pMe -> pIM3D, pMe -> mcx_data.pcollision );