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 минуты
27 декабря 2022