Основная тригонометрия в разработке 2D игр

При разработке игр часто приходится работать с треугольниками и углами. Если в игровом мире даже всего 2 объекта, между ними уже можно построить треугольник, посчитать расстояние и найти различные углы.

В данном посте я расскажу о наиболее часто встречающейся математике в 2D-играх.

Нахождение расстояния между 2 точками

Обычно используется теорема Пифагора: a^2 + b^2 = c^2

Расстоянием между двумя точками является гипотенуза прямоугольного треугольника, то есть её можно посчитать по формуле:

c=\sqrt{a^{2} +b^{2}}

c - гипотенуза. a - один катет, b - другой катет.

int dx = mouse.x - player.x;
int dy = mouse.y - player.y;
double distance = sqrt(dx * dx + dy * dy);

В некоторых языках программирования, например, в JavaScript, есть встроенная функция для вычисления корня из суммы квадратов аргументов.

const dx = mouse.x - player.x;
const dy = mouse.y - player.y;
// const distance = Math.sqrt(dx * dx + dy * dy);
const distance = Math.hypot(dx, dy);

Нахождение угла между 2 точками

Это очень частая задача, например, когда нужно повернуть спрайт, чтобы он “смотрел” на определённую точку.

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

\alpha = arctg\frac{\Delta y}{\Delta x}

где \Delta y - разница y-составляющих координат, \Delta x - разница x-составляющих координат.

// double angle = atan((mouse.y - player.y) / (mouse.x - player.x));
double angle = atan2(mouse.y - player.y, mouse.x - player.x);

JavaScript:

// const angle = Math.atan((mouse.y - player.y) / (mouse.x - player.x));
const angle = Math.atan2(mouse.y - player.y, mouse.x - player.x);

Не стоит использовать atan, поскольку могут возникнуть проблемы при делении на 0 или atan отработает некорректно, если ему будет передан ноль.

Функция atan2 не имеет этих проблем.

Нахождение x, y - составляющих вектора скорости по направлению к точке

С помощью пропорции

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

\frac{\Delta x}{x} = \frac{\Delta y}{y}
y = \frac{\Delta y x}{\Delta x}
x = \frac{\Delta x y}{\Delta y}
float dx = mouse.x - player.x;
float dy = mouse.y - player.y;

float x = 1;
float y = dy / dx; // не домножаем на x, поскольку он равен единице
// или
float y = 1;
float x = dx / dy; // не домножаем на y, поскольку он равен единице

С помощью тригонометрии

x = cos(arctg(\frac{\Delta y}{\Delta x}))
y = sin(arctg(\frac{\Delta y}{\Delta x}))
double angle = atan2(mouse.y - player.y, mouse.x - player.x);
double x = cos(angle);
double y = sin(angle);

Copyright © 2019 Александр Майоров. Все права защищены.