AS3を使用してフラッシュゲームの衝突検出をプログラムしていますが、ボールをラインから跳ね返す方法を理解するのに問題があります。ボールの2D速度を表すベクトルを追跡し、ボールが衝突する線(別名法線)に垂直なベクトルにそれを反映させようとしています。私の問題は、新しいベクトルを理解する方法がわからないことです(これは通常のベクトルに反映されています)。Math.atan2を使用して、法線とボールのベクトルの違いを見つけることができると思いましたが、問題を解決するためにそれを拡張する方法がわかりません。
3 に答える
任意の次元の法線nを持つ線/(超) 面からの任意のベクトルvのミラー反射は、射影テンソルを使用して計算できます。vのnへの平行射影は次のとおりです。= ( v . n ) n = v . ん。ここで、 nnは法線とそれ自体の外積 (またはテンソル) です。デカルト座標では、要素を持つ行列です: . 垂直投影は、元のベクトルとその平行投影の差です: v - vnn[i,j] = n[i]*n[j]
||。ベクトルが反映されると、その平行投影は逆になりますが、垂直投影は維持されます。したがって、反射ベクトルは次のようになります。
v ' = - v || + ( v - v ||) = v - 2 v || = v . ( I - 2 nn ) = v . R ( n )、ここで
R ( n ) = I - 2 nn
( Iは単位テンソルで、デカルト座標では単に対角単位行列diag(1)です)
Rは反射テンソルと呼ばれます。デカルト座標では、成分R[i,j] = delta[i,j] - 2*n[i]*n[j]
を持つ実対称行列です。nに関しても対称です。delta[i,j] = 1
i == j
0
R (- n ) = I - 2(- n )(- n ) = I - 2 nn = R ( n )
したがって、外向きの法線を使用するか内向きの法線nを使用するかは問題ではありません。結果は同じになります。
2 次元およびデカルト座標では、 ( RR
の行列表現) は次のようになります。
[ R00 R01 ] [ 1.0-2.0*n.x*n.x -2.0*n.x*n.y ]
R = [ ] = [ ]
[ R10 R11 ] [ -2.0*n.x*n.y 1.0-2.0*n.y*n.y ]
反射されたベクトルのコンポーネントは、行ベクトル行列の積として計算されます。
v1.x = v.x*R00 + v.y*R10
v1.y = v.x*R01 + v.y*R11
または展開後:
k = 2.0*(v.x*n.x + v.y*n.y)
v1.x = v.x - k*n.x
v1.y = v.y - k*n.y
三次元では:
k = 2.0*(v.x*n.x + v.y*n.y + v.z*n.z)
v1.x = v.x - k*n.x
v1.y = v.y - k*n.y
v1.z = v.z - k*n.z
ボールがライン/壁に当たる正確なポイントを見つけることは、より複雑です -こちらを参照してください。