Japanese | English | Korean

Samples

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

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


目次



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

バウンディングボリュームの作成には各クラスのコンストラクタを使用します。それぞれのコンストラクタの詳細は Javadoc をご覧ください。また、ここでは同時にデバッグ用メッシュの作成も行っています。
デバッグ用メッシュの作成には各バウンディングボリュームの createMesh() メソッドを使用します。この操作によりデバッグ用メッシュの描画が可能となります。



注意:デバッグ用メッシュは、描画速度よりも描画精度を優先するため、多数の頂点を使用しています。

// Boxバウンディングボリュームの作成
box = new Box( new Vector3D( 150.0f, 100.0f, 50.0f ) );
box.createMesh( _color_def, DrawableObject3D.BLEND_NORMAL, 100 );
shapeArray[i++] = box;

// Capsule バウンディングボリュームの作成
capsule = new Capsule( 25.0f, 90.0f );
capsule.createMesh( _color_red, DrawableObject3D.BLEND_ALPHA, 30 );
shapeArray[i++] = capsule;

// Sphereバウンディングボリュームの作成
sphere = new Sphere( 30.0f );
sphere.createMesh( _color_black, DrawableObject3D.BLEND_ALPHA, 30 );
shapeArray[i++] = sphere;

2.Shape の移動

Shape の移動には各 Shape の setTransform() メソッドを使用します。この操作により Shape 座標からワールド座標への変換が行われます。

Transform transBV = new Transform();

transBV.setIdentity(); // 単位行列の設定

AbstractShape shape = shapeArray[i];

transBV.translate( ( float )( _x * i ), ( float )( _y * i ), 0 );
transBV.rotate( 1, 1, 0, ( float )_angle );
shape.setTransform( transBV ); // ワールド座標への変換を設定

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

各 Shape に対応するデバッグ用メッシュを描画する際には、Shape に設定されたワールド座標への変換を取得する必要があります。このワールド座標への変換の取得には各 Shape のgetMeshTransform() メソッドを使用します。また、実際にデバッグ用メッシュの描画を行うためには getMesh() メソッドを使用し、対応する Primitive オブジェクトを取得する必要があります

shapeArray[i].getMeshTransform( transBV ) ;
// 上記でBV に設定されているShape座標からワールド座標への変換を取得する
view.set( vTrans ); // カメラ座標への変換行列をコピーする
view.multiply( transBV );

g3.renderObject3D(shapeArray[i].getMesh(), view );

4.バウンディングボリューム同士の衝突判定

衝突判定には Collision クラスの isHit() メソッドを使用します。 isHit() メソッドは衝突対象となる Shape の組み合わせによって複数存在します。ここではバウンディングボリューム同士の単純な衝突判定を行うため、 isHit( Shape shape0, Shape shape1, boolean notify ) を使用しています。なお、isHit() メソッドの詳細については Javadoc をご覧ください。

/*
* 衝突判定を行うメソッド
* Hit するたびにBoxの色を
* 白→緑→青と変えていく
*/
private void collisionCheck(){

int color = _color_def ;

// Box と Capsule の当たり判定
if ( collision.isHit( box, capsule, false ) ) {
color=_color_hit;
}
// Box と Sphere の当たり判定
if ( collision.isHit( box, sphere, false ) ) {
if( color == _color_hit ) color= _color_hit2;
else color= _color_hit;
}

// 衝突情報を元に、Boxの色を設定する。
int[] colors = box.getMesh().getColorArray();
for ( int j=0; j
if ( colors[j]==color ) {
break;
}
colors[j] = color;
}
}