THREE.js と WebGL レンダリングを使用して 3D でブレークアウト ゲームを作成しています。THREE.Ray を使用して、バウンドするボールと、ユーザーが制御できる下部のプラットフォームとの衝突を検出したいのですが、うまくいきません。
プラットフォームからボール (またはその逆) にレイをキャストすることはできましたが、これを行うと、ボールが画面の中央で動かなくなり、アニメーション化できなくなります。
var ray = new THREE.Ray( platform.position, ball.position.subSelf( platform.position ).normalize() );
var intersects = ray.intersectObject( ball );
if ( intersects.length > 0 ) console.log(intersects[0].distance);
subSelf
and を削除しようとしましnormalize()
たが、検出が壊れます。
これがゲームで、コードは script.js にあります。
http://dl.dropbox.com/u/4531743/WebGL/Breakout-3D/index.html
コンソールを開いて見ると、パネルを動かすと距離の値が変化することがわかるので、いいですね。ただし、すべてのフレームでその位置に設定されているため、ボールをアニメートすることはできません。
http://dl.dropbox.com/u/4531743/WebGL/Breakout-3D/index.html#disableRay
上記は、ボールとパネルの Z 位置を計算し、それがより大きく、パネルの幅 (x) 座標内にあるかどうかを確認し、そうである場合は跳ね返すことによって、私が最初に行った方法です。
ボールの跳ね返りは、フレームごとに X 座標と Z 座標を固定量だけ変更するだけで、いずれかの方向に行き過ぎた場合は、その量を逆にして元に戻ります。