@givemoneybiatch
Немного веб, немного гейм

Физика движения по параболе. С какой скоростью и под каким углом нужно бросить тело?

Есть два танка, которые стреляют друг в друга. Между ними есть препятствия при чем наивысшее препятствие не всегда посередине. Нужно сделать так, чтобы танк которым управляет компьютер, попадал в другой танк максимально точно.
Я пытался делать на глаз и получается оно тоже очень на глаз. Угол выставляю такой, что пушка смотрит прямо на самую высокую точку и беру запас 10 градусов.
Vector3 highestPoint;
            Vector3 throwVector = highestPoint - gameObject.transform.position;
            float anglef = Mathf.Atan2 (throwVector.y, throwVector.x) * Mathf.Rad2Deg - 10; // повернуть на 10 градусов выше
            SetAngle (anglef);

Далее, если взять по формулах
//время полета
// h - разница высоты между самой высокой точкой и текущим положением танка, т.е. расстояние, которое нужно преодолеть по высоте
float time = Mathf.Sqrt (2 * h / g);

// скорость, с которой нужно выпустить пулю
// S - расстояние, которое нужно преодолеть по координате X. Разница по х между текущим танком и танком игрока
float speed = S / time;


Но все как-то криво и через одно место выходит. Подскажите формулу?

5cad01098467b884837330.png
  • Вопрос задан
  • 666 просмотров
Решения вопроса 2
hint000
@hint000
у админа три руки
Решим задачу в два этапа.
1. Будем считать, что у нас только одна вершина горы. Задача построения параболы по трём точкам. Две точки - два танка, третья точка - вершина горы. Окей гугл построение параболы по трём точкам.
Решили.
2. Несколько вершин. Даже по имеющейся картинке сложно на глаз определить, какая из двух вершин важнее для нашего выстрела - левая, или та, что в середине картинки. Поэтому надо определить список вершин. Тут есть простор для придумывания алгоритма. Например, так. Находим самую высокую точку, при условии, что она выше обоих танков. Добавляем её в список. Далее рекурсивный обход (здесь танки условно считаем тоже вершинами). Проводим прямую от левого (правого) танка до последней вершины. Повторяем поиск максимальной высоты, но считаем высоту над проведённой прямой. Условие выхода из рекурсии - нет точек выше прямой. Таким образом нашли список вершин. Для каждой вершины из списка решаем задачу построения параболы. Из всех парабол выбираем самую высокую.
Решили.
3... так, мы же хотели решить в два этапа? Но это была голая математика, и для физической задачи мы получили не совсем то, что нужно. Внезапно. Решение было бы правильным, если бы танк мог управлять скоростью снаряда. Тогда мы могли бы выстрелить по любой рассчитанной выше параболе. Но у танка скорость снаряда фиксированная (или я отстал от жизни?), и мы управляем только углом. Поэтому надо сначала решать задачу из школьного учебника физики, про выстрел из пушки. Угол определяем без учёта гор. В общем случае будет два решения, два возможных угла - по настильной траектории, и по навесной. У нас же горная местность, так что настильная траектория (угол от 0 до 45 градусов) нас не устраивает, остаётся одно решение. Т.е. единственный шанс попасть в цель - стрелять с найденным сейчас углом, не зависимо от расположения вершин. Если на пути снаряда окажется гора, значит шансов попасть в цель было ровно ноль, при любом другом угле будет промах, даже если не наткнёмся на гору. Получается, что все рассуждения на этапах 1 и 2 были напрасны? Не совсем. Мы можем ими воспользоваться, чтобы определить, налетит снаряд на гору или не налетит (при точном прицеливании). Если выясним, что налетит на гору, значит можно не стрелять, сэкономить снаряд, но это уже слегка за пределами абстрактных условий задачи.
Ответ написан
Beshere
@Beshere
Разработчик
Предлагаю воспользоваться методом, который применяют настоящие артиллеристы - берём цель в вилку и начинаем "загонять цель в угол", "сжимая клещи". Пусть проделывает это "виртуально", обсчитывая траекторию но не запуская снаряд, пока не добьётся попадания.

Поскольку у вас можно менять угол возвышения и скорость снаряда, то алгоритм перебора по двум параметрам может быть разным, но суть будет одна - фиксируем один параметр и варьируем другой.

P.S. Еще прикольно будет танку походу пристрелки заполнять артиллерийскую таблицу (угол, скорость, координаты разрыва), тогда он сможет накрывать цели быстрее со временем.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Conan_Doyle
Это вроде бы 10 класс, "движение тела под углом к горизонту"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы