com.nttdocomo.ui.graphics3d.collision
インタフェース CollisionObserver


public interface CollisionObserver

形状の衝突判定時に、衝突情報とともに通知を受けるためのインターフェースです。

CollisionクラスのisHitメソッド、isPickedメソッドにて、Hit/Pickした時に、衝突情報を使って 処理を行いたい場合、次のようにします。

  1. このインターフェースを実現するクラスを作成する。
  2. 必要なコールバック時の処理を実装する。
    • CollisionクラスのisHitメソッドに対する処理 → onHit()
    • CollisionクラスのisPickedメソッドに対する処理 → onPick()
  3. 1.のインスタンスを生成し、CollisionクラスのsetObserverメソッドにより、 Collisionオブジェクトに設定する。
CollisionObserverの各メソッドの呼び出しは、CollisionクラスのisHitメソッド、 isPickedメソッド内部で同期的に呼び出されます。

Collisionクラスの説明にあるサンプルコードを参照してください。

導入されたバージョン:
DoJa-5.0 (903i)

メソッドの概要
 boolean onHit(Shape shape, int boneId0, BoundingVolume[] bv, int[] boneId1, boolean[] isInvolved, Vector3D[] point)
           衝突判定対象がBVFigureオブジェクトの時、CollisionクラスのisHitメソッドにてHitした場合に 呼ばれます。
 void onHit(Shape shape0, Shape shape1, boolean isInvolved, Vector3D point)
           CollisionクラスのisHitメソッドにてHitした場合に呼ばれます。
 void onHit(Shape shape, Sphere sphere, float contactPos, Vector3D normal, float distance)
           衝突判定対象がShapeSphereの軌跡の時、CollisionクラスのisHitメソッドにてHitした場合に 呼ばれます。
 void onPick(Ray ray, Figure fig, IntersectionAttribute[] attr)
           CollisionクラスのisPickedメソッドにてPickした場合に呼ばれます。
 

メソッドの詳細

onHit

public void onHit(Shape shape0,
                  Shape shape1,
                  boolean isInvolved,
                  Vector3D point)

CollisionクラスのisHitメソッドにてHitした場合に呼ばれます。

Collisionクラスの次のメソッドで、引数notifyをtrueにしてHitした場合に呼ばれます。

取得できる情報は次のとおりです。(shape0とshape1が逆の組合せも含む)
shape0shape1内包状態として渡される値交点データ
PointBVtrue or falseなし
(内包状態がfalseの場合、交点はPointと同じになるため、交点データとしては返しません)
Line(Ray)Trianglefalseあり
Line(Ray)Planefalseあり
LineBVtrueなし
Line(Ray)BVfalseあり
TriangleTrianglefalseなし
TrianglePlanefalseなし
TriangleBVtrue or falseなし
PlanePlanefalseなし
PlaneBVfalseなし
BVBVtrue or falseなし

パラメータ:
shape0 - 衝突判定対象のShapeオブジェクトの片方が渡されます。
shape1 - 衝突判定対象のShapeオブジェクトの他方が渡されます。
isInvolved - 片方がBoundingVolumeオブジェクトで、この内部に他方のオブジェクトが 内包されているかどうかのboolean値が渡されます。内包されている場合trueが渡され、内包されていない場合falseが渡されます。
point - 交点を表わすVector3Dオブジェクトが渡されます。交点が無い場合はnullが渡されます。

onHit

public boolean onHit(Shape shape,
                     int boneId0,
                     BoundingVolume[] bv,
                     int[] boneId1,
                     boolean[] isInvolved,
                     Vector3D[] point)

衝突判定対象がBVFigureオブジェクトの時、CollisionクラスのisHitメソッドにてHitした場合に 呼ばれます。

Collisionクラスの次のメソッドで、引数notifyをtrueにしてHitした場合に呼ばれます。

取得できる情報は次のとおりです。
shape内包状態として渡される値交点データ
Pointtrue or falseなし
(内包状態がfalseの場合、交点はPointと同じになるため、交点データとしては返しません)
Linetrueなし
Line(Ray)falseあり
Triangletrue or falseなし
Planefalseなし
BVtrue or falseなし

パラメータ:
shape - 衝突判定対象のShapeオブジェクトが渡されます。
boneId0 -
次の値が渡されます。
bv - HitしたBoundingVolumeの配列が渡されます。
boneId1 -
引数bvの順で、ボーンIDの配列が渡されます。
isInvolved - 引数bvの順で、引数shapeが引数bvのBoundingVolumeオブジェクトに 内包されているかどうかのboolean値の配列が渡されます。 引数shapeがBoundingVolumeオブジェクトの場合、引数bvがこれに内包されているかどうかの判定 も含んでいます。内包されている場合trueが渡され、内包されていない場合falseが渡されます。
point - 引数bvの順で、交点を表わすVector3Dオブジェクトの配列が渡されます。 交点が無い場合は配列要素にnullが入っています。
戻り値:
処理を続けるかどうか(更に呼び出しが必要かどうか)を返します。 処理を続ける場合はtrueを返し、処理を打ち切る場合はfalseを返します。

onHit

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

衝突判定対象がShapeSphereの軌跡の時、CollisionクラスのisHitメソッドにてHitした場合に 呼ばれます。

Collisionクラスの次のメソッドで、引数notifyをtrueにしてHitした場合に呼ばれます。

上記メソッドの引数sphereが、引数posに移動する軌跡において、次の値を取得することができます。(図1)

  • 最初にsphereが引数shapeに衝突する(接する)ときのsphereの中心位置
  • このときのshapeの法線ベクトル(normal)
  • このときの中心とshapeの距離(distance)

衝突する(接する)ときのsphereの中心位置は、座標値ではなく、sphereの初期中心位置から引数posまでの 軌跡ベクトルの長さに対する相対距離(contactPos)で取得できます。これは、軌跡ベクトルの 長さを1としたときの比率です。

sphereの初期位置にて既にshapeと衝突している場合は、 contactPosが0となり、この位置でのnormalとdistanceが渡されます。(図2)

パラメータ:
shape - 衝突判定対象のShapeオブジェクトが渡されます。
sphere - 衝突判定対象のSphereオブジェクトが渡されます。
contactPos - 引数sphereが引数shapeに最初に衝突する(接する)ときのsphereの中心位置を表わす 相対距離が渡されます。
normal - 衝突位置におけるshapeの法線ベクトルを表わすVector3Dオブジェクトが渡されます。 引数shapeが、PointLine(Ray)の場合、法線がないためnullが渡されます。
distance - 衝突位置における、sphereの中心からshapeまでの距離が渡されます。shapeが BoundingVolumeで、sphereの中心が初期状態でこの内部に位置するとき、0が渡されます。

onPick

public void onPick(Ray ray,
                   Figure fig,
                   IntersectionAttribute[] attr)

CollisionクラスのisPickedメソッドにてPickした場合に呼ばれます。

パラメータ:
ray - Rayオブジェクトが渡されます。
fig - Figureオブジェクトが渡されます。
attr - 交点におけるPick情報を表わすIntersectionAttributeオブジェクトの配列が 渡されます。CollisionクラスのisPickedメソッドにて、引数isAllPickedをfalseにした場合は、 要素が1つとなります。