斜面を跳ねるボール
上からボールが落下してきて傾斜がついた地面で跳ね返る、というサンプルです。 ボールを運動させるとき、ボールと地面の距離を観測することで衝突を検知することができます。また、衝突する地点の法線情報を用いると、地面で跳ね返った後のボールの速さ・方向を求めることができます。
目次
1.ボールと地面の衝突判定
ボールの地面への衝突は、ボールに設定したRayと地面のFigureの交差によって判定します。Rayは常に、ボールに対して中心から進行方向に向かうように設定します。Rayと地面が交差しているとき、Rayの始点(ボール中心)と交点との距離がボール速さとボール半径の和より小さければ、ボールが地面に衝突すると判定できます。
2.跳ね返りによる速度変化
ボールの跳ね返りによる速度変化の計算には、衝突地点の地面の法線情報を用います。 ボールと地面の反発係数をe、衝突時のボールの速度ベクトルをv、衝突地点の法線ベクトルをnとするならば、反発後のボールの速度は次のように計算できます。
3.交差判定のサンプルコード
ここでは、斜面を跳ねるボールの運動について、ボールのRayと地面の交差判定を中心にサンプルコードを説明します。
まず、交点の情報を得るために、CollisionObserverインターフェースを実装したMyCollisionObserverクラスのインスタンスをCollisionクラスに登録します。このCollisionインスタンスによって、ボールのRayと地面のFigureの交差を判定します。
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 交点の情報
*/
float speed = ball.getSpeed();
// 次に衝突するようなら、反発の情報をボールにセット
if ( attr[0].distance < speed + ball.radius ) {
ball.nextCollision = true;
衝突の判定がなされた場合、セットされた交点情報の法線ベクトルを用いて、跳ね返り後の速度を計算します。
float dot = velocity.dot( colAttr.normal );
// 跳ね返り後の速度ベクトルを求める
velocity.add( - dot * ( 1.f + coefficient ) * colAttr.normal.getX(),
- dot * ( 1.f + coefficient ) * colAttr.normal.getZ() );

BouncingBall 実行時のボールの軌道

