CollisionObserver を用いた衝突判定
MascotCapsule エクステンション には衝突判定の通知を受けるオブザーバーとして CollisionObserver が存在します。CollisionObserver は Collision クラスにオブザーバーとして登録されます。CollisionObserver はインターフェースで、 onHit(), onPick() メソッドが定義されています。Collision クラスに CollisionObserver が登録されている場合、この両メソッドは対応する isHit(), isPicked() メソッドが戻り値として true を返す前に呼び出され、引数に詳細な情報を受け取ります。
目次
注意:本サンプルでは説明の都合上、描画に対する効率化を行なっておりません。特にBounding Volumeに対応するメッシュの描画は実行速度を低下させる恐れがあります。これはBounding Volumeに対するMeshはあくまでもデバッグ用であり、描画速度よりも形状の精度を優先してあるためです。
1.CollisionObserver の作成
CollisionObserverはインターフェースですので、使用するためにはその実装を行う必要があります。本サンプル中では MyCollisionObserver クラスとして実装されています。 なお、本サンプルではすべてのメソッドに実装が与えられているわけではありません。
*
* Copyright 2006 HI Corporation. All rights reserved.
*/
import com.nttdocomo.ui.graphics3d.collision.*;
import com.nttdocomo.ui.util3d.* ;
public class MyCollisionObserver implements CollisionObserver {
StringBuffer sphereBuffer = new StringBuffer();
Shape capsule, sphere, ray;
Vector3D crossPoint;
public MyCollisionObserver( Shape capsule, Shape sphere ,
this.capsule = capsule;
this.sphere = sphere;
this.ray = ray;
public void resetString(){
sphereBuffer.delete( 0, sphereBuffer.length() ) ;
public boolean onHit( Shape shape, int boneId0,
int[] boneId1,
boolean[] isInvolved,
Vector3D[] point ) {
public void onHit( Shape shape0, Shape shape1,
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,
public void onPick( Ray ray,
IntersectionAttribute[] attr ) {
public Vector3D getCrossPoint() {
public String getCapsuleString() {
public String getSphereString() {
2.CollisionObserver の登録
CollisionObserver を Collision クラスに登録するためには Collision クラスの setObserver() メソッドを使用します。これにより CollisionObserver が利用できるようになります。
collision.setObserver( cObserver );
登録した CollisionObserver の登録を解除するには、引数に null を渡します。

