壁衝突の結果の角度を決定する


14

そのため、固定された水平または垂直の壁に向かう方向に移動するオブジェクトがあります。オブジェクトが跳ね返る角度を計算するにはどうすればよいですか?オブジェクトは、任意の角度で壁に近づくことができます。

回答:


18

壁の法線ベクトルがわかっていて、オブジェクトの方向が入っている場合、必要なのは平面を横切るベクトル反射です

場合nは正規化されたベクトルであり、vはある入ってくる方向、そして何が欲しいのである- (2(NVのn - V)。マイナス記号は、オブジェクトの速度が反転するため、反射式が実際に方向を反転しないという事実を説明します。

この答えは、角度ではなくベクトル演算の観点から与えられます。なぜなら、角度を使用する明確な理由がない場合は、通常、それが望ましいからです。角度について話す必要がある場合、反射角は入射角に等しいことに注意してください。角度が法線から測定される場合、出力角度は入力角度の否定です。角度が壁から測定される場合、それは入ってくる角度の補数です。


素晴らしい説明。それは私にとってはうまくいきました!ありがとう!
-DRiFTy

13

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;
}

申し訳ありませんが、2Dゲームです。あなたが言ったように、私はどんな壁でも使えるようにしたいので、角度に基づいてそれを維持したいと思います。ありがとう!
-DRiFTy

2Dもカバーするように編集しました。実際には、それだけで、2Dベクトル、同じ操作や数式で、同じだ
グスタボ・マシエル

2Dゲームの壁は斜めになっている場合があるため、説明if it's a 2D game and your walls are guaranteed to be horizontal or verticalは正しくありません。答えの2番目の部分は、正しい実装を示しています。私見では、部品の順序を逆にして、一般的な解決策を最初に強調して提示する必要がありますが、直角の解決策は例外的なケースの簡略化として提示されます。
XenoRo

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.