形状の衝突判定時に、衝突情報とともに通知を受けるためのインターフェースです。
CollisionクラスのisHitメソッド、isPickedメソッドにて、Hit/Pickした時に、衝突情報を使って
処理を行いたい場合、次のようにします。
CollisionクラスのsetObserverメソッドにより、
Collisionオブジェクトに設定する。
CollisionクラスのisHitメソッド、
isPickedメソッド内部で同期的に呼び出されます。
Collisionクラスの説明にあるサンプルコードを参照してください。
| メソッドの概要 | |
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)
衝突判定対象が ShapeとSphereの軌跡の時、CollisionクラスのisHitメソッドにてHitした場合に
呼ばれます。
|
void |
onPick(Ray ray,
Figure fig,
IntersectionAttribute[] attr)
CollisionクラスのisPickedメソッドにてPickした場合に呼ばれます。
|
| メソッドの詳細 |
public void onHit(Shape shape0,
Shape shape1,
boolean isInvolved,
Vector3D point)
CollisionクラスのisHitメソッドにてHitした場合に呼ばれます。
Collisionクラスの次のメソッドで、引数notifyをtrueにしてHitした場合に呼ばれます。
| shape0 | shape1 | 内包状態として渡される値 | 交点データ |
|---|---|---|---|
Point | BV | true or false | なし (内包状態がfalseの場合、交点はPointと同じになるため、交点データとしては返しません) |
Line(Ray) | Triangle | false | あり |
Line(Ray) | Plane | false | あり |
Line | BV | true | なし |
Line(Ray) | BV | false | あり |
Triangle | Triangle | false | なし |
Triangle | Plane | false | なし |
Triangle | BV | true or false | なし |
Plane | Plane | false | なし |
Plane | BV | false | なし |
| BV | BV | true or false | なし |
shape0 - 衝突判定対象のShapeオブジェクトの片方が渡されます。shape1 - 衝突判定対象のShapeオブジェクトの他方が渡されます。isInvolved - 片方がBoundingVolumeオブジェクトで、この内部に他方のオブジェクトが
内包されているかどうかのboolean値が渡されます。内包されている場合trueが渡され、内包されていない場合falseが渡されます。point - 交点を表わすVector3Dオブジェクトが渡されます。交点が無い場合はnullが渡されます。
public boolean onHit(Shape shape,
int boneId0,
BoundingVolume[] bv,
int[] boneId1,
boolean[] isInvolved,
Vector3D[] point)
衝突判定対象がBVFigureオブジェクトの時、CollisionクラスのisHitメソッドにてHitした場合に
呼ばれます。
Collisionクラスの次のメソッドで、引数notifyをtrueにしてHitした場合に呼ばれます。
Collision.isHit(Shape shape, BVFigure bvFig, boolean isAllHit, boolean notify)Collision.isHit(BVFigure bvFig0, BVFigure bvFig1, boolean isAllHit0,
boolean isAllHit1, boolean notify)BoundingVolumeごとの判定処理で、Hitするたびに呼ばれます。
もう呼び出される必要がない場合はfalseを返してください。
| shape | 内包状態として渡される値 | 交点データ |
|---|---|---|
Point | true or false | なし (内包状態がfalseの場合、交点はPointと同じになるため、交点データとしては返しません) |
Line | true | なし |
Line(Ray) | false | あり |
Triangle | true or false | なし |
Plane | false | なし |
| BV | true or false | なし |
shape - 衝突判定対象のShapeオブジェクトが渡されます。boneId0 - BVFigureオブジェクトのFigure全体のBoundingVolumeである場合、BVFigure.ID_WHOLE_FIGUREが渡されます。
BVFigureオブジェクトのボーンのBoundingVolumeである場合、ボーンIDが渡されます。
BVFigure.ID_NOT_FIGUREが渡されます。
bv - HitしたBoundingVolumeの配列が渡されます。boneId1 - BVFigureオブジェクトのFigure全体のBoundingVolumeである場合、BVFigure.ID_WHOLE_FIGUREが渡されます。
BVFigureオブジェクトのボーンのBoundingVolumeである場合、ボーンIDが渡されます。
isInvolved - 引数bvの順で、引数shapeが引数bvのBoundingVolumeオブジェクトに
内包されているかどうかのboolean値の配列が渡されます。
引数shapeがBoundingVolumeオブジェクトの場合、引数bvがこれに内包されているかどうかの判定
も含んでいます。内包されている場合trueが渡され、内包されていない場合falseが渡されます。point - 引数bvの順で、交点を表わすVector3Dオブジェクトの配列が渡されます。
交点が無い場合は配列要素にnullが入っています。
public void onHit(Shape shape,
Sphere sphere,
float contactPos,
Vector3D normal,
float distance)
衝突判定対象がShapeとSphereの軌跡の時、CollisionクラスのisHitメソッドにてHitした場合に
呼ばれます。
Collisionクラスの次のメソッドで、引数notifyをtrueにしてHitした場合に呼ばれます。
上記メソッドの引数sphereが、引数posに移動する軌跡において、次の値を取得することができます。(図1)
衝突する(接する)ときのsphereの中心位置は、座標値ではなく、sphereの初期中心位置から引数posまでの 軌跡ベクトルの長さに対する相対距離(contactPos)で取得できます。これは、軌跡ベクトルの 長さを1としたときの比率です。
sphereの初期位置にて既にshapeと衝突している場合は、 contactPosが0となり、この位置でのnormalとdistanceが渡されます。(図2)
shape - 衝突判定対象のShapeオブジェクトが渡されます。sphere - 衝突判定対象のSphereオブジェクトが渡されます。contactPos - 引数sphereが引数shapeに最初に衝突する(接する)ときのsphereの中心位置を表わす
相対距離が渡されます。normal - 衝突位置におけるshapeの法線ベクトルを表わすVector3Dオブジェクトが渡されます。
引数shapeが、Point、Line(Ray)の場合、法線がないためnullが渡されます。distance - 衝突位置における、sphereの中心からshapeまでの距離が渡されます。shapeが
BoundingVolumeで、sphereの中心が初期状態でこの内部に位置するとき、0が渡されます。
public void onPick(Ray ray,
Figure fig,
IntersectionAttribute[] attr)
ray - Rayオブジェクトが渡されます。fig - Figureオブジェクトが渡されます。attr - 交点におけるPick情報を表わすIntersectionAttributeオブジェクトの配列が
渡されます。CollisionクラスのisPickedメソッドにて、引数isAllPickedをfalseにした場合は、
要素が1つとなります。