Japanese | English | Korean

Samples

CollisionObserver を用いた衝突判定

MascotCapsule エクステンション には衝突判定の通知を受けるオブザーバーとして CollisionObserver が存在します。CollisionObserver は Collision クラスにオブザーバーとして登録されます。CollisionObserver はインターフェースで、 onHit(), onPick() メソッドが定義されています。Collision クラスに CollisionObserver が登録されている場合、この両メソッドは対応する isHit(), isPicked() メソッドが戻り値として true を返す前に呼び出され、引数に詳細な情報を受け取ります。


目次



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

1.CollisionObserver の作成

CollisionObserverはインターフェースですので、使用するためにはその実装を行う必要があります。本サンプル中では MyCollisionObserver クラスとして実装されています。 なお、本サンプルではすべてのメソッドに実装が与えられているわけではありません。

/**
* CollisionObserver を継承し、通知を受けるクラス
*
* Copyright 2006 HI Corporation. All rights reserved.
*/

import com.nttdocomo.ui.graphics3d.collision.*;
import com.nttdocomo.ui.util3d.* ;

public class MyCollisionObserver implements CollisionObserver {

StringBuffer capsuleBuffer = new StringBuffer();
StringBuffer sphereBuffer = new StringBuffer();
Shape capsule, sphere, ray;

Vector3D crossPoint;

public MyCollisionObserver( Shape capsule, Shape sphere ,
Shape ray ) {
this.capsule = capsule;
this.sphere = sphere;
this.ray = ray;
}


public void resetString(){
capsuleBuffer.delete( 0, capsuleBuffer.length() ) ;
sphereBuffer.delete( 0, sphereBuffer.length() ) ;
}

public boolean onHit( Shape shape, int boneId0,
BoundingVolume[] bv,
int[] boneId1,
boolean[] isInvolved,
Vector3D[] point ) {
return true;
}

public void onHit( Shape shape0, Shape shape1,
boolean isInvolved, Vector3D point ) {
if( shape0 == ray ) crossPoint = point;
else crossPoint = null;
if( shape0 == capsule ) capsuleBuffer.append(
" Capsule 内包? =" + isInvolved );
if( shape0 == sphere ) sphereBuffer.append(
" sphere 内包? =" + isInvolved );
}

public void onHit( Shape shape, Sphere sphere,
float contactPos, Vector3D normal, float distance ) {
}

public void onPick( Ray ray,
com.nttdocomo.ui.graphics3d.Figure fig,
IntersectionAttribute[] attr ) {
}

public Vector3D getCrossPoint() {
return crossPoint;
}

public String getCapsuleString() {
return capsuleBuffer.toString();
}

public String getSphereString() {
return sphereBuffer.toString();
}

}

2.CollisionObserver の登録

CollisionObserver を Collision クラスに登録するためには Collision クラスの setObserver() メソッドを使用します。これにより CollisionObserver が利用できるようになります。

// CollisionObserver の登録
collision.setObserver( cObserver );

登録した CollisionObserver の登録を解除するには、引数に null を渡します。