Japanese | English | Korean

Samples

Figure に対するBV

MascotCapsule エクステンションではモデルデータである Figure クラスに対し、バウンディングボリューム(BV)を設定することが可能となっています。

目次


注意:本サンプルでは説明の都合上、描画に対する効率化を行なっておりません。特にバウンディングボリュームに対応するメッシュの描画は実行速度を低下させる恐れがあります。これはバウンディングボリュームに対するMeshがあくまでもデバッグ用であり、描画速度よりも形状の精度を優先しているためです。


BVFIgure クラスはボーン構造を持ち、ActTable によるボーンアニメーションの付加を行うことができます。また、BVFigureが持つボーンに対して、バウンディングボリュームを設定することが可能です。。さらに、BVFigure全体を包含するバウンディングボリュームを作成することも可能です。従って、Figure オブジェクトが関係する衝突判定を行う際には以下の選択を取ることが可能です。

  • Figure 全体への衝突判定
  • Figure の個別のボーンに対する衝突判定
  • ActTable によるボーンアニメーションを反映した衝突判定
  • Figure の持つ基本姿勢への衝突判定

これらの選択は Figure クラスのインスタンスからバウンディングボリュームや BVFigure クラスを作成する際に決定されます。



1.基本姿勢において3Dデータ全体を包含するバウンディングボリュームを作成する

これには、IMICRO3D_mcx_BVBuilder_createBVFigurex()を使用します。この関数は、基本姿勢において3Dデータを包含するバウンディングボリュームを作成するため、アニメーションの反映はできない点にご注意ください。アニメーションの反映については、「2.各キーフレームにおける3Dデータ全体を包含するバウンディングボリューム」で説明します。
以下では、3Dデータ全体に対してBoxのバウンディングボリュームをFit率1=4096で指定しています。

/*----- BVFigure -----*/
pMe -> mcx_data.pbvfig = IMICRO3D_mcx_BVBuilder_createBVFigurex( pMe -> pIM3D,
       pMe -> pAlc,
       &pMe -> mc_data.figure,
       MCX_SHAPE_TYPE_BOX,
       4096,
       &e );
if( e != mcx_NoException )
{
return HI_FALSE;
}

また、作成したBVFigure はBVFigure座標系からワールド座標系に変換する必要があります。これには、IMICRO3D_mcx_BVFigure_setTransformx()を使用します。

/*----- BVFigure座標系をワールド座標系に変換 -----*/
IMICRO3D_mcx_BVFigure_setTransformx( pMe -> pIM3D,
      pMe -> mcx_data.pbvfig,
      NULL,
      &e );

第三引数にNULL を設定すると恒等変換となり、BVFigure 座標系がワールド座標系と一いたします。

デバッグ用メッシュの作成には、IMICRO3D_mcx_DebugShapeRenderer_createx()を使用します。
メッシュに、ライトの設定や半透明の属性を付加することも可能です。
また、作成したBVFigure、メッシュはそれぞれ必ず使用後に破棄してください。
これらについては、「バウンディングボリューム」を参照してください。

BVFigureのメッシュを描画する際には、IMICRO3D_mcx_BVFigure_getBVx()でFigure 全体のバウンディングボリューム オブジェクトの取得を行う必要があります。

mcxBoundingVolumex       *bv;

bv = IMICRO3D_mcx_BVFigure_getBVx( pMe -> pIM3D, pMe -> mcx_data.pbvfig );

if( bv && e == mcx_NoException )
{
/*----- DebugShapeRendererの色を設定 -----*/
IMICRO3D_mcx_DebugShapeRenderer_setColorx( pMe -> pIM3D,
   pMe -> mcx_data.pmcxDsr,
   0x00aaffaa );

/*----- DebugShapeRendererの描画 -----*/
IMICRO3D_mcx_DebugShapeRenderer_renderShapex( pMe -> pIM3D
         pMe -> mcx_data.pmcxDsr
         &pMe -> mc_data.render,
         ( mcxShapex * )bv,
         &pMe -> mc_data.view_trans,
         &e );
}


2.各キーフレームにおける3Dデータ全体を包含するバウンディングボリューム(BV)を作成する

3Dデータ(キャラクタ)の動作(例:腕を広げる/腕を下ろす)などで各アニメーションキーフレーム時における3Dデータは大きく変わる可能性があります。そこで、各アニメーションキーフレームに3Dデータ全体を包含するバウンディングボリュームを作成する必要があります。
これには、IMICRO3D_mcx_BVFigure_calculateBVx()を使用します。

/*----- 3Dデータを内包するバウンディングボリュームの作成 -----*/
IMICRO3D_mcx_BVFigure_calculateBVx( pMe -> pIM3D,
    pMe -> mcx_data.pbvfig,
    MCX_SHAPE_TYPE_BOX,
    4096,
    &e );


3.BVFigureとバウンディングボリュームの衝突判定

衝突判定には、まずCollisionクラスの作成を行う必要があります。これには、
IMICRO3D_Collision_createx()を使用します。また使用後は必ず破棄してください。これらについては、「バウンディングボリューム」を参照してください。

Collisionクラス作成後IMICRO3D_mcx_Collision_isHitShapeTo BVFigurex()を使用することでBVFigureとShapeの衝突判定が行えます。
以下では、BVfigureとCapsuleの衝突判定を行っています。

mcxCollisionIsHitDatax hitData;

/*----- 当たり判定 -----*/
isHit_c = IMICRO3D_mcx_Collision_isHitShapeToBVFigurex( pMe -> pIM3D,
     pMe -> mcx_data.pcollision,
     ( mcxShapex* ) pMe -> mcx_data.pcapsule,
     ( mcxBVFigurex* ) pMe -> mcx_data.pbvfig,
     HI_FALSE,
     &hitData,
     &e );

/*----- Capsule -----*/
if(isHit_c == HI_TRUE)     /* When box collides with capsule */
{
IMICRO3D_mcx_DebugShapeRenderer_setColorx( pMe -> pIM3D,
   pMe -> mcx_data.pmcxDsr_capsule,
   0x00ffffff);
}
else
{
IMICRO3D_mcx_DebugShapeRenderer_setColorx( pMe -> pIM3D,
   pMe -> mcx_data.pmcxDsr_capsule,
   0x00ff0000);
}