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.

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.