Określ wynikowy kąt zderzenia ściany

14

Więc mam obiekt poruszający się w kierunku stałej poziomej lub pionowej ściany. Jak obliczyć kąt, pod jakim obiekt powinien się odbić? Obiekt może zbliżyć się do ściany pod dowolnym kątem.

DRiFTy
źródło

Odpowiedzi:

18

Jeśli znasz normalny wektor ściany i masz kierunek do obiektu, to chcesz uzyskać odbicie wektora w płaszczyźnie .

Jeśli n jest znormalizowanym wektorem, a v jest kierunkiem przychodzącym , to czego chcesz - - (2 ( n · v ) n - v ). Znak minus uwzględnia fakt, że formuła odbicia w rzeczywistości nie odwraca kierunku, ponieważ zmieniałaby się prędkość obiektu.

Ta odpowiedź jest podana w kategoriach matematyki wektorowej, a nie kąta, ponieważ jest to zwykle lepsze, jeśli nie masz wyraźnego powodu, aby użyć kąta. Pamiętaj, że jeśli musisz mówić o kątach, kąt odbicia jest równy kątowi padania. Jeśli kąt jest mierzony od normalnego, kąt wychodzący jest negacją kąta wejściowego; jeśli kąt jest mierzony od ściany, jest to uzupełnienie kąta wejściowego.

John Calsbeek
źródło
Świetne wyjaśnienie. Świetnie mi to wyszło! Dzięki!
DRiFTy
13

Nie określono, czy była to gra 2D czy 3D. Ale jeśli jest to gra 2D, a twoje ściany są gwarantowane w poziomie lub w pionie, a chcesz po prostu odbić obiekt od nich, istnieje znacznie łatwiejszy sposób niż radzenie sobie z odbiciami.

Po prostu zaneguj składową X prędkości obiektu przy uderzeniu w ścianę pionową lub składową Y prędkości obiektu przy uderzeniu o ścianę poziomą. Przykład:

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

Ale jeśli naprawdę zależy ci na znajomości kąta, to ogólnie biorąc, kąt odbicia jest taki sam, jak kąt padania. Kąt ten jest mierzony w stosunku do normalnej ściany. Oto zdjęcie, które powinno to wyjaśnić:

wprowadź opis zdjęcia tutaj

Na wypadek, gdybyś musiał poradzić sobie z tym w przypadku dowolnych ścian, musisz zastanowić się, jak odzwierciedlić wektor. To tak naprawdę niewielka formuła, która bierze normalną ścianę i wektor padania, i zwraca wektor odbity dla ciebie. Oto wzór używany przez XNA:

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

A dla 2D możesz po prostu zrobić:

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
David Gouveia
źródło
Przepraszamy za to, jest to gra 2D. Chciałbym zachować ją w oparciu o kąt, ponieważ tak jak powiedziałeś, chciałbym móc użyć dowolnej ściany. Dzięki!
DRiFTy
Zredagowałem go, aby objąć również 2D. W rzeczywistości jest tak samo, tylko z wektorami 2D, tymi samymi operacjami i formułami
Gustavo Maciel
Ściana w grze 2D może być ustawiona pod kątem, więc stwierdzenie if it's a 2D game and your walls are guaranteed to be horizontal or verticaljest nieprawidłowe. Druga część odpowiedzi dotyczy poprawnej implementacji. IMHO kolejność części powinna zostać odwrócona, przedstawiając najpierw ogólne rozwiązanie, z naciskiem, podczas gdy rozwiązanie kąta prostego przedstawiono jako uproszczenie w wyjątkowym przypadku.
XenoRo