Japanese | English | Korean

Samples

斜面を跳ねるボール

上からボールが落下してきて傾斜がついた地面で跳ね返る、というサンプルです。 ボールを運動させるとき、ボールと地面の距離を観測することで衝突を検知することができます。また、衝突する地点の法線情報を用いると、地面で跳ね返った後のボールの速さ・方向を求めることができます。

目次





1.ボールと地面の衝突判定

ボールの地面への衝突は、ボールに設定したRayと地面のFigureの交差によって判定します。Rayは常に、ボールに対して中心から進行方向に向かうように設定します。Rayと地面が交差しているとき、Rayの始点(ボール中心)と交点との距離がボール速さとボール半径の和より小さければ、ボールが地面に衝突すると判定できます。


2.跳ね返りによる速度変化

ボールの跳ね返りによる速度変化の計算には、衝突地点の地面の法線情報を用います。 ボールと地面の反発係数をe、衝突時のボールの速度ベクトルをv、衝突地点の法線ベクトルをnとするならば、反発後のボールの速度は次のように計算できます。

       


3.交差判定のサンプルコード

ここでは、斜面を跳ねるボールの運動について、ボールのRayと地面の交差判定を中心にサンプルコードを説明します。
まず、交点の情報を得るために、CollisionObserverインターフェースを実装したMyCollisionObserverクラスのインスタンスをCollisionクラスに登録します。このCollisionインスタンスによって、ボールのRayと地面のFigureの交差を判定します。

// Collision Observer の登録
cObserver = new MyCollisionObserver( ball );
collision.setObserver( cObserver );

(…中略…)

// ボールの Ray と、地面の交わりをチェックする
collision.isPicked( ball.ray, groundFig, null, false, true );

RayとFigureの交差が判定された場合、交点情報と共にMyCollisionObserverのonPickメソッドが呼ばれます。onPickメソッドでは、得られた交点情報を用いてボールと地面の衝突を判定し、交点情報をボールにセットします。

/**
* 次に衝突するかチェックして法線を得る
* @params ray 交差判定に使用されたRay
* @params fig 交差判定に使用されたFigure
* @params attr 交点の情報
*/
public void onPick( Ray ray, Figure fig, IntersectionAttribute[] attr ) {
// ボールの速さを求める
float speed = ball.getSpeed();

// 次に衝突するようなら、反発の情報をボールにセット
if ( attr[0].distance < speed + ball.radius ) {

ball.colAttr = attr[0];
ball.nextCollision = true;
}
}

衝突の判定がなされた場合、セットされた交点情報の法線ベクトルを用いて、跳ね返り後の速度を計算します。

// 法線ベクトルと速度ベクトルの内積を求める
float dot = velocity.dot( colAttr.normal );

// 跳ね返り後の速度ベクトルを求める
velocity.add( - dot * ( 1.f + coefficient ) * colAttr.normal.getX(),
- dot * ( 1.f + coefficient ) * colAttr.normal.getY(),
- dot * ( 1.f + coefficient ) * colAttr.normal.getZ() );


BouncingBall 実行時のボールの軌道