Figure に対するBV(BAC/TRA)
MascotCapsule エクステンション ではモデルデータである Figure クラスに対し、バウンディングボリューム(BV)を設定することが可能となっています。BVFIgure クラスはボーン構造を持ち、ActTable によるボーンアニメーションの付加を行うことができます。また、BVFigureが持つボーンに対して、BoundingVolumeを設定することが可能です。さらに、BVFigure全体を包含するBoundingVolumeを作成することも可能です。従って、Figure オブジェクトが関係する衝突判定を行う際には以下の選択を取ることが可能です。
- Figure 全体への衝突判定
- Figure の個別のボーンに対する衝突判定
- ActTable によるボーンアニメーションを反映した衝突判定
- Figure の持つ基本姿勢への衝突判定
これらの選択は Figure クラスのインスタンスからバウンディングボリュームや BVFigure クラスを作成する際に決定されます。
目次
- 1.BVFigure の作成および設定
- 2.BVFigure 全体に対するバウンディングボリュームの取得
- 3.BVFigure とバウンディングボリュームの衝突判定
- 4.BVFigure 全体を包むバウンディングボリューム確認用メッシュの削除
注意:本サンプルでは説明の都合上、描画に対する効率化を行なっておりません。特にBounding Volumeに対応するメッシュの描画は実行速度を低下させる恐れがあります。これはBounding Volumeに対するMeshはあくまでもデバッグ用であり、描画速度よりも形状の精度を優先してあるためです。
1.BVFigure の作成および設定
BVFigure は BVBuilder クラスのメソッド createBVFigure() を使用して作成します。このとき、 createBVFigure() に渡す引数によって異なるBVFigure オブジェクトが生成されます。 ここでは Figure の各ボーンにバウンディングボリュームが付加された BVFigure オブジェクトを生成しています。
bvFig = BVBuilder.createBVFigure( figure, Shape.TYPE_BOX, 1.0f );
bvFig.setAction( aTable, 0 );
BVFigure クラスに現在のフレーム時間を設定するには、Figure クラスと同様に setTime() メソッドを使用します。
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() メソッドによって生成されたバウンディングボリュームはアニメーションを反映したものとなります。
*/
// 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 との衝突判定を示します。
if ( collision.isHit( figVolume, capsule, false ) ) {
4.BVFigure 全体を包むバウンディングボリューム確認用メッシュの削除
BVFigure から calculateBV() メソッドに対応してバウンディングボリュームを作成した場合、時として非常に負荷がかかる場合があります。そのため、毎フレームごとに BoundingVolume.deleteMesh() メソッドによりメッシュの削除を行う必要があります。また、破棄するオブジェクトが毎フレーム発生するため、必要に応じてガベージコレクションを実行する System.gc() メソッドを呼び出す必要もあります。
figVolume.deleteMesh();
System.gc();

