回答:
壁の法線ベクトルがわかっていて、オブジェクトの方向が入っている場合、必要なのは平面を横切るベクトルの反射です。
場合nは正規化されたベクトルであり、vはある入ってくる方向、そして何が欲しいのである- (2(N・V)のn - V)。マイナス記号は、オブジェクトの速度が反転するため、反射式が実際に方向を反転しないという事実を説明します。
この答えは、角度ではなくベクトル演算の観点から与えられます。なぜなら、角度を使用する明確な理由がない場合は、通常、それが望ましいからです。角度について話す必要がある場合、反射角は入射角に等しいことに注意してください。角度が法線から測定される場合、出力角度は入力角度の否定です。角度が壁から測定される場合、それは入ってくる角度の補数です。
2Dゲームか3Dゲームかを指定しませんでした。しかし、2Dゲームであり、壁が水平または垂直であることが保証されており、オブジェクトをそれらから跳ね返したい場合、反射を処理するよりもはるかに簡単な方法があります。
垂直の壁にぶつかったときのオブジェクトの速度のX成分、または水平の壁にぶつかったときのオブジェクトの速度のY成分を単純に無効にします。例:
if( /* hit vertical wall */ )
{
object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
object.velocity.y *= -1;
}
しかし、角度を本当に知りたい場合は、一般的に、反射角は入射角と同じです。この角度は、壁の法線に対して測定されます。明確にする必要がある画像を次に示します。
任意の壁でこれを処理する必要がある場合は、ベクトルの反映方法を検討する必要があります。実際には、壁の法線と入射ベクトルを取り、反射されたベクトルを返す小さな式です。XNAが使用する式は次のとおりです。
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return vector - 2 * Vector3.Dot(vector, normal) * normal;
}
また、2Dの場合は次のようにします。
public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
は正しくありません。答えの2番目の部分は、正しい実装を示しています。私見では、部品の順序を逆にして、一般的な解決策を最初に強調して提示する必要がありますが、直角の解決策は例外的なケースの簡略化として提示されます。
これは、壁の法線ベクトルに沿ってベクトルを反映するだけです。