Odpowiedzi:
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.
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ć:
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;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
jest 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.
Chodzi tu o odbicie wektora wzdłuż ścian normalnego wektora.