Найти тему
47 подписчиков

Решим простую физическую 2D задачку

#задачка

Попробуем такой формат. Есть синий кружок радиуса 0.5 и массы равной 1. Есть стенка с центром в 3 юнитах от него ширины 0.5. Нам нужно чтобы шарик попал на оранжевую платформу размера 0.1 с центром в 6 юнитах. Как это сделать используя Unity физику? Проект, где можно поиграться будет по ссылке. Задачка Task_1.


Полное обоснование:

Один из вариантов решения понятное дело просто приложить нужную силу. В целом в физике в движках лучше работать в силах или в скоростях, так как если перемещать объект просто за трансформ, то там физика не будет работать корректно. А теперь к решению. По сути это задача баллистики. Начнём мы с силы. Которую мы задаём Силу в данном случае лучше прикладывать, как мгновенную, то есть ForceMode2D.Impulse.

В режиме Impulse — это можно расценивать, как упругий удар. То есть "мгновенно приложенная сила" — это импульс. То есть p = m * v; Так как m = 1, то у нас сводится всё к тому, что мы придали некоторую скорость v0 объекту.

Так как у нас нет ветра, трения воздуха и т.п. То по сути можно разделить уравнения на два для простоты расчётов.

Посчитаем y. Высоту нам нужно набрать больше 4.5, но чтобы ничего не коснуться и проще было считать возьмём с запасом 2g, где g=9.81.

h = vY * vY / 2 g — максимальная высота тела зная ускорение. Так как мы мгновенно придаём силу, то vY = sqrt(2 *2* g * g) При g = 9.81, это равно vY = 19,62.

Уравнение движения выглядит так: y = y0 + 2g * t + g * t * t / 2

Теперь посчитаем время t, чтобы вычислить скорость по x. Из формулы выше получится. t * t * g / 2 + 2g * t = 0. t = -2 * g * 2 / g = 4. То есть полёт займёт 4с.

По x всё проще. Только нужно учитывать. Что без трения об воздух.

Формула движение x = x0 + vX * t; Ускорения у нас тут не будет, так как мы в начальный момент придаём только импульс, а изначальные силы никакие не действуют. Для удобство начало координат у нас в центре круга. То есть 6 = vX * 4. Где v1 скорость по оси X.

vX = 6 / 4 = 1.5;

То есть искомая сила. _force = (1.5, 19.62).

Это не единственное решение. И можно подобрать числа для любых значений. Но оно показывает, как можно "подстраивать математические законы под условия для удобства". И какими формулами можно пользоваться, чтобы рассчитать траекторию по которой скажем босс будет кидать предметы в игрока или в какие-то зоны. Чтобы полёт был реалистичным по физике, а не по заготовленному сплайну. Скрипт с решением есть в репозитории. Чтобы включить готовое решение нужно включить SolutionObject.

Если подобный вид задачек интересен. С примером на Unity сборки такого примера, то поставьте 🔥. Это конечно больше математическая задача сама по себе. Но она показывает, как подстраиваются решения под точные значения и как можно удобно пользоваться 2д физикой. Будем думать над интересностью тех или иных задач. Для задач будет общий репозиторий и первая задача уже там. Параметры верные я выставлять в задачи не буду.
2 минуты