1

AS3を使用してフラッシュゲームの衝突検出をプログラムしていますが、ボールをラインから跳ね返す方法を理解するのに問題があります。ボールの2D速度を表すベクトルを追跡し、ボールが衝突する線(別名法線)に垂直なベクトルにそれを反映させようとしています。私の問題は、新しいベクトルを理解する方法がわからないことです(これは通常のベクトルに反映されています)。Math.atan2を使用して、法線とボールのベクトルの違いを見つけることができると思いましたが、問題を解決するためにそれを拡張する方法がわかりません。

4

3 に答える 3

1

任意の次元の法線nを持つ線/(超) 面からの任意のベクトルvのミラー反射は、射影テンソルを使用して計算できます。vnへの平行射影は次のとおりです= ( 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] = 1i == j0

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

ボールがライン/壁に当たる正確なポイントを見つけることは、より複雑です -こちらを参照してください。

于 2013-02-15T10:40:24.673 に答える