Определить результирующий угол столкновения стены

14

Таким образом, у меня есть объект, движущийся в направлении к неподвижной горизонтальной или вертикальной стене. Как рассчитать угол, под которым должен отражаться объект? Объект может подойти к стене под произвольным углом.

вьюжный
источник

Ответы:

18

Если вы знаете вектор нормали стены и имеете входящее направление для объекта, то вам нужно отражение вектора на плоскости .

Если n является нормализованным вектором, а v является входящим направлением, то вы хотите - (2 ( n · v ) n - v ). Знак минус объясняет тот факт, что формула отражения на самом деле не меняет направление, поскольку скорость объекта меняется.

Этот ответ дается с точки зрения векторной математики, а не угла, потому что это обычно предпочтительнее, если у вас нет явной причины использовать угол. Обратите внимание, что если вам нужно говорить об углах, угол отражения равен углу падения. Если угол измеряется от нормали, исходящий угол является отрицанием входящего угла; если угол измеряется от стены, то это дополнение входящего угла.

Джон Калсбек
источник
Отличное объяснение. Это отлично сработало для меня! Благодарность!
DRiFTy
13

Вы не указали, была ли это 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;
}
Дэвид Гувея
источник
Извините, это 2D игра. Я бы хотел, чтобы это основывалось на ракурсе, потому что, как вы сказали, я бы хотел использовать любую стену. Благодарность!
DRiFTy
Я отредактировал это, чтобы покрыть 2D также. На самом деле, это то же самое, только с 2D векторами, теми же операциями и формулами
Gustavo Maciel
Стена в 2D-игре может быть наклонной, поэтому утверждение if it's a 2D game and your walls are guaranteed to be horizontal or verticalневерно. Вторая часть ответа посвящена правильной реализации. ИМХО, порядок частей должен быть обратным, представляя общее решение сначала и в энфазисе, в то время как решение под прямым углом представлено как упрощение для исключительного случая.
XenoRo