Ответы:
Если вы знаете вектор нормали стены и имеете входящее направление для объекта, то вам нужно отражение вектора на плоскости .
Если n является нормализованным вектором, а v является входящим направлением, то вы хотите - (2 ( n · v ) n - v ). Знак минус объясняет тот факт, что формула отражения на самом деле не меняет направление, поскольку скорость объекта меняется.
Этот ответ дается с точки зрения векторной математики, а не угла, потому что это обычно предпочтительнее, если у вас нет явной причины использовать угол. Обратите внимание, что если вам нужно говорить об углах, угол отражения равен углу падения. Если угол измеряется от нормали, исходящий угол является отрицанием входящего угла; если угол измеряется от стены, то это дополнение входящего угла.
Вы не указали, была ли это 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;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
неверно. Вторая часть ответа посвящена правильной реализации. ИМХО, порядок частей должен быть обратным, представляя общее решение сначала и в энфазисе, в то время как решение под прямым углом представлено как упрощение для исключительного случая.
Это как раз отражение вектора вдоль вектора нормалей стен.