壁沿いに走る
車が、壁と衝突したら壁沿いに方向を変えて走行する、というサンプルです。 車を壁沿いに走行させるためには、車と壁の衝突を判定し、衝突時に進行方向を壁と平行になるように変更する必要があります。このサンプルでは、車の進行方向にRay(半直線)を設定し、このRayと壁の交点情報を利用することで、衝突判定や速度計算を行っています。
目次
1.車と壁の衝突判定
車の壁への衝突は、車に設定したRayと壁のFigureの交差によって判定します。最初に述べたように、Rayは常に車に対して中心から進行方向に向かうように設定します。Rayと壁が交差しているとき、Rayの始点(車の中心)と交点との距離が車の速さよりも小さければ、車が壁に衝突すると判定できます。
2.壁の平行方向の走行
車が壁と衝突したら、壁に平行になるように走行させます。この方向転換は、車の速度ベクトルについて壁の法線方向成分をゼロにすることで実現します。 計算には、衝突地点の壁の法線方向を用います。この法線の情報は、車のRayと壁の交差判定時に得ることができます。
3.壁沿い走行のサンプルコード
ここでは、車のRayと壁の交差判定を中心にサンプルコードを説明します。
まず、交点の情報を得るために、CollisionObserverインターフェースを実装したMyCollisionObserverクラスのインスタンスをCollisionクラスに登録します。このCollisionクラスのインスタンスによって、Rayと壁のFigureの交差を判定します。
cObserver = new MyCollisionObserver( car );
collision.setObserver( cObserver );
(…中略…)
// 車の Ray と、壁の交わりをチェックする
collision.isPicked( car.ray, wallFig, null, false, true );
RayとFigureの交差が判定された場合、交点情報と共にMyCollisionObserverのonPickメソッドが呼ばれます。onPickメソッドでは、Rayの始点と交点の距離を用いて車と壁の衝突を判定し、交点情報を車にセットします。
* @params ray 交差判定に使用されたRay
* @params fig 交差判定に使用されたFigure
* @params attr 交点の情報
*/
float speed = car.getSpeed();
// 壁に衝突するようなら、交点の情報を車にセット
if ( attr[0].distance < speed + car.radius ) {
car.wallCollision = true;
衝突の判定がなされた場合、車の速度を、壁沿いになるように計算します。onPickメソッドによりセットされた壁交点の法線方向ベクトルを用いて、速度ベクトルにおける壁の法線方向成分をゼロにします。
float dot = velocity.dot( wallAttr.normal );
// 壁の法線方向成分をゼロにする
velocity.add( - dot * wallAttr.normal.getX(),
- dot * wallAttr.normal.getZ() );

AlongWall 実行時の画面

