Bestimmen Sie den resultierenden Winkel der Wandkollision

14

Ich habe also ein Objekt, das sich in eine Richtung zu einer festen horizontalen oder vertikalen Wand bewegt. Wie berechne ich den Winkel, in dem das Objekt abprallen soll? Das Objekt kann sich der Wand in einem beliebigen Winkel nähern.

DRiFTy
quelle

Antworten:

18

Wenn Sie den Normalenvektor der Wand kennen und eine Eingangsrichtung für das Objekt haben, möchten Sie die Reflexion eines Vektors über eine Ebene .

Wenn n ein normalisierter Vektor ist und v die Eingangsrichtung ist , ist das , was Sie wollen, - (2 ( n · v ) n - v ). Das Minuszeichen erklärt, dass die Reflexionsformel die Richtung nicht tatsächlich umkehrt, da sich die Geschwindigkeit eines Objekts umkehren würde.

Diese Antwort wird in Vektormathematik und nicht in einem Winkel angegeben, da dies normalerweise vorzuziehen ist, wenn Sie keinen expliziten Grund für die Verwendung eines Winkels haben. Beachten Sie, dass der Reflexionswinkel gleich dem Einfallswinkel ist, wenn Sie über Winkel sprechen müssen. Wenn der Winkel von der Normalen gemessen wird, ist der Ausgangswinkel die Negation des Eingangswinkels. Wenn der Winkel von der Wand aus gemessen wird, ist dies das Komplement des eingehenden Winkels.

John Calsbeek
quelle
Tolle Erklärung. Für mich hat es super geklappt! Vielen Dank!
DRiFTy
13

Sie haben nicht angegeben, ob es sich um ein 2D- oder 3D-Spiel handelt. Aber wenn es sich um ein 2D-Spiel handelt und Ihre Wände garantiert horizontal oder vertikal sind und Sie nur das Objekt von ihnen abprallen möchten, gibt es einen viel einfacheren Weg, als mit Reflexionen umzugehen.

Negieren Sie einfach die X-Komponente der Geschwindigkeit des Objekts, wenn Sie auf eine vertikale Wand treffen, oder die Y-Komponente der Geschwindigkeit des Objekts, wenn Sie auf eine horizontale Wand treffen. Beispiel:

if( /* hit vertical wall */ )
{
    object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
    object.velocity.y *= -1;
}

Wenn Sie jedoch den Winkel genau kennen möchten, ist der Reflexionswinkel im Allgemeinen derselbe wie der Einfallswinkel. Dieser Winkel wird in Bezug auf die Wandnormale gemessen. Hier ist ein Bild, das es deutlich machen sollte:

Bildbeschreibung hier eingeben

Falls Sie dies jemals für beliebige Wände tun müssen, müssen Sie untersuchen, wie Sie einen Vektor reflektieren. Es ist wirklich nur eine kleine Formel, die den Normal- und den Inzidenzvektor der Wand verwendet und den reflektierten Vektor für Sie zurückgibt. Hier ist die Formel, die XNA verwendet:

public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
    return vector - 2 * Vector3.Dot(vector, normal) * normal;
}

Und für 2D können Sie einfach Folgendes tun:

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
David Gouveia
quelle
Tut mir leid, es ist ein 2D-Spiel. Ich würde es gerne auf der Basis des Winkels halten, weil ich, wie Sie sagten, gerne jede Wand benutzen könnte. Vielen Dank!
DRiFTy
Ich habe es so bearbeitet, dass es auch 2D abdeckt. Eigentlich ist es das gleiche, nur mit 2D-Vektoren, gleichen Operationen und Formeln
Gustavo Maciel
Eine Wand in einem 2D-Spiel ist möglicherweise abgewinkelt, sodass die Aussage if it's a 2D game and your walls are guaranteed to be horizontal or verticalnicht korrekt ist. Der zweite Teil der Antwort befasst sich mit der korrekten Implementierung. IMHO sollte die Reihenfolge der Teile umgekehrt werden, wobei die allgemeine Lösung zuerst und in Betonung dargestellt wird, während die rechtwinklige Lösung als Vereinfachung für den Ausnahmefall dargestellt wird.
XenoRo