Figure に対するBV(BAC/TRA)

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

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

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

目次


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

1.BVFigure の作成および設定

BVFigure は BVBuilder クラスのメソッド createBVFigure() を使用して作成します。このとき、 createBVFigure() に渡す引数によって異なるBVFigure オブジェクトが生成されます。 ここでは Figure の各ボーンにバウンディングボリュームが付加された BVFigure オブジェクトを生成しています。

// BVFigureクラスのインスタンスを作成し、Figureクラスと同様にアクションを設定
bvFig = BVBuilder.createBVFigure( figure, Shape.TYPE_BOX, 1.0f );
bvFig.setAction( aTable, 0 );

BVFigure クラスに現在のフレーム時間を設定するには、Figure クラスと同様に setTime() メソッドを使用します。

// Figure と BVFigure に現在フレーム時間を設定
figure.setTime( frame );
bvFig.setTime( frame );
frame = frame < aTable.getMaxFrame( 0 ) ? frame + aTable.getMaxFrame( 0 ) / 200 : 0;


2.BVFigure 全体に対するバウンディングボリュームの取得

BVFigure 全体に対するバウンディングボリュームの設定にはいくつかの方法がありますが、 ここでは BVFigure.calculateBV() メソッドを使用した設定を行います。BVFigure 全体に設定されたバウンディングボリュームは BVFigure.getBV() メソッドによって取得することができ、用メッシュの作成および描画が可能です。 また、BVFigure.calculateBV() メソッドによって生成されたバウンディングボリュームはアニメーションを反映したものとなります。

/**
* figVolueme は BoundingVolume クラスのインスタンス
*/

// Figure全体を包むバウンディングボリュームの作成
bvFig.calculateBV( Shape.TYPE_BOX, 1.0f );
figVolume = bvFig.getBV();

// Figure全体を包むバウンディングボリュームのデバッグ用メッシュを作成および描画
figVolume.createMesh( 0x00ff00, Primitive.BLEND_ALPHA, 50 );
Transform viewFigVolume = new Transform( vTrans );

viewFigVolume.multiply( figVolume.getMeshTransform( null ) );
g3.renderObject3D( figVolume.getMesh(), viewFigVolume );


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

BVFigure とバウンディングボリュームの衝突判定には Collision.isHit() メソッドを使用します。このとき、Collision.isHit() メソッドに対し渡す引数により処理が変化します。 ここでは一例として BVFigure 全体を包むバウンディングボリュームと Capsule との衝突判定を示します。

// BVFigure と Capsule の当たり判定
if ( collision.isHit( figVolume, capsule, false ) ) {
color= _color_hit;
} else {
color = _color_red ;
}


4.BVFigure 全体を包むバウンディングボリューム確認用メッシュの削除

BVFigure から calculateBV() メソッドに対応してバウンディングボリュームを作成した場合、時として非常に負荷がかかる場合があります。そのため、毎フレームごとに BoundingVolume.deleteMesh() メソッドによりメッシュの削除を行う必要があります。また、破棄するオブジェクトが毎フレーム発生するため、必要に応じてガベージコレクションを実行する System.gc() メソッドを呼び出す必要もあります。

g3.flushBuffer();
figVolume.deleteMesh();
System.gc();


このページの先頭へ戻る