Мяч летит в стену. Как посчитать направление после отскока?
Интуиция подсказывает: «отразить угол». Но угол — это арктангенс,
градусы, неудобно. Есть формула, которая работает через векторы:
R = V - 2 * (V · N) * N
Где:
V — вектор направления до удара
N — нормаль поверхности (перпендикуляр к стене, единичный вектор)
R — вектор направления после отскока
Vector2 Reflect(Vector2 velocity, Vector2 normal)
{
// normal должен быть нормализован
float dot = Vector2.Dot(velocity, normal);
return velocity - 2f * dot * normal;
}
// Примеры нормалей:
// Пол (горизонтальная поверхность) → normal = Vector2.up (0, 1)
// Стена справа → normal = Vector2.left (-1, 0)
// Наклонная платформа 45° → normal = new Vector2(-0.707f, 0.707f)
// Использование:
ballVelocity = Reflect(ballVelocity, wallNormal);
В Unity это уже встроено:
ballVelocity = Vector2.Reflect(ballVelocity, wallNormal);
Но понимать формулу важно — потому что Reflect работает для любого угла.
Не только для горизонтальных/вертикальных стен, но и для наклонных
поверхностей, движущихся платформ, рикошетов.
Откуда формула? V · N — это «насколько вектор V направлен вдоль N».
2 * (V · N) * N — это та часть V, которую нужно «отзеркалить».
Вычитаем её из V дважды — получаем отражение.
#мат_геймдев #МатРазбор #физика #векторы