Расчет упреждения для тела летящего по параболе [Решено]

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

Re: Расчет упреждения для тела летящего по параболе [Решено]

Сообщение bojlahg 03 фев 2015, 20:47

Вот недавно писал случай для 2D (точный расчет).
WebPlayer: http://bojlahg.com/proto/ShotTest/

функция возвращает true если имеет смысл стрелять (снаряд может догнать цель)
shoterPos - положение стрелка
targetPos - положение цели
targetVel - скорость цели
projVel - скорость снаряда
shotDir - расчитанное направление выстрела
Синтаксис:
Используется csharp
private bool CalcShot(Vector2 shoterPos, Vector2 targetPos, Vector2 targetVel, float projVel, out Vector2 shotDir)
{
        Vector2 shot1, shot2;
        float a = targetPos.y - shoterPos.y;
        float b = targetVel.y;
        float c = targetPos.x - shoterPos.x;
        float d = targetVel.x;
        float e = projVel;
        float a2 = a * a, b2 = b * b, c2 = c * c, d2 = d * d, e2 = e * e;

        shot1.x = (-Mathf.Sqrt(-c2 * (a2 * d2 - a2 * e2 - 2 * a * b * c * d + b2 * c2 - c2 * e2)) + a2 * d - a * b * c) / (a2 + c2);
        shot1.y = (-a * Mathf.Sqrt(-c2 * (a2 * d2 - a2 * e2 - 2 * a * b * c * d + b2 * c2-c2 * e2)) - a * c2 * d + b * c2 *c) / (c * (a2 + c2));
        shot2.x = (Mathf.Sqrt(-c2 * (a2 * d2 - a2 * e2 - 2 * a * b * c * d + b2 * c2 - c2 * e2)) + a2 * d - a * b * c) / (a2 + c2);
        shot2.y = (a * Mathf.Sqrt(-c2 * (a2 * d2 - a2 * e2 - 2 * a * b * c * d + b2 * c2-c2 * e2)) - a * c2 * d + b * c2 *c) / (c * (a2 + c2));
        float t1 = (shoterPos.x - targetPos.x) / (targetVel.x - shot1.x);
        float t2 = (shoterPos.x - targetPos.x) / (targetVel.x - shot2.x);

        if(t1 > 0 && t2 > 0)
        {
                if(t1 < t2)
                {
                        shotDir = shot1.normalized;
                        return true;
                }
                else
                {
                        shotDir = shot2.normalized;
                        return true;
                }
        }
        else
        {
                if(t1 > 0)
                {
                        shotDir = shot1.normalized;
                        return true;
                }
                else if(t2 > 0)
                {
                        shotDir = shot2.normalized;
                        return true;
                }
                else
                {
                        shotDir = Vector2.zero;
                        return false;
                }
        }
}
 
Мои проекты: MahJah Star Factory Cop Car Swash! Spline Editor
Аватара пользователя
bojlahg
UNIверсал
 
Сообщения: 392
Зарегистрирован: 13 авг 2011, 10:57
Откуда: Сатка
Skype: bojlahg
  • Сайт

Re: Расчет упреждения для тела летящего по параболе [Решено]

Сообщение Syberex 04 фев 2015, 08:37

sledo писал(а):Ок, вот вам выкладка по другим расстояниям, но для расчетов используются углы первого треугольника. Для простоты расчета я взял прямоугольный треугольник со сторонами АВ 173, ВС 100, СА 200 и углами АВС 90, ВСА 60, САВ 30. Соответственно скорость точки1 (цель) равна 100м/с, скорость точки2 (снаряд) равна 200м/с.
Итак, что если расстояние до цели будет не 170м, а 100м? АС2 = АВ2 * sinB / sinC = 100 * 1 / 0.86 = 116.2 м. t2 = S / V = 0.581c Соответственно, для того что бы Точка1 и Точка2 встретились, Точка1 должна оказаться там же где и точка за 0.581с. Считаем какое расстояние пройдет Точка1 за 0.581с. S = t * V = 0.581 * 100 = 58.1м. Считаем, где окажется Точка2 на отрезке ВС первого треугольника. ВС2 = АВ2 * sinA / sin C = 100 * 0.5 / 0.86 = 58,1. Точка1 и Точка2 пересекутся на отрезке ВС в точке 58,139534883720930232558139534884 через 0.581с, ч.т.д. И так для любого расчета в пределах углов первого треугольника. Точность задается только количество цифр после запятой, т.е. она абсолютна, в отличии от формулы выше.

Ок. Я понял почему ты находишь угол у точки A, а не у точки D - потому что нужно узнать координаты точки B, чтобы потом навестись на нее с помощью LookAt. Найти точку B еще можно с помощью нахождения точки пересечения прямой AB и окружности проходящей через точку D с нужным радиусом, только расчеты будут заморочистее :D
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Расчет упреждения для тела летящего по параболе [Решено]

Сообщение Syberex 04 фев 2015, 09:08

В итоге задумка сводится к тому, что вместо таблицы заранее рассчитанных значений времени полета снаряда или графика, берется одно заранее рассчитанное значение на каком то среднем расстоянии. В итоге наша пушка будет бить точно на среднем расстоянии, а на очень близком и дальнем будет мазать, так как если посмотреть на график полученный автором статейки что я приводил - он не прямолинеен. Чем дальше от среднего значения, тем больше вероятность промаха.
Для точного попадания надо всегда бить в точку которая находится на одном заранее выбранном расстоянии.
А в таком случае для очень близкого расстояния, например 10-50 метров (когда рассчитано среднее значение метров на 500), такое упреждение рассчитает точку пересечения в радиусе 500 метров (зато точно), а вражеский объект то может туда и не доедет/долетит вовсе, может он нацелен метров на 100 максимум... Ведь поражать объект нужно как можно быстрей!
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Расчет упреждения для тела летящего по параболе [Решено]

Сообщение DbIMok 04 фев 2015, 18:13

то, о чем путанно пытается рассказать sledo выглядит так
Изображение
подробнее можно прочитать например http://sntbul.bmstu.ru/file/out/505582
пользоваться табличкой вместо формулы в случае движения по параболе нормальный трюк. к тому же результат будет точнее, чем рассчитанный по формуле.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Расчет упреждения для тела летящего по параболе [Решено]

Сообщение sledo 04 фев 2015, 19:38

Syberex писал(а):В итоге задумка сводится к тому, что вместо таблицы заранее рассчитанных значений времени полета снаряда или графика, берется одно заранее рассчитанное значение на каком то среднем расстоянии. В итоге наша пушка будет бить точно на среднем расстоянии, а на очень близком и дальнем будет мазать

Вы же это конечно посчитали? Можно посмотреть на расчеты?

DbIMok писал(а):то, о чем путанно пытается рассказать sledo выглядит так
Изображение

Вы попали прямо в точку. Вот только об этом я написал еще 2 дня назад.
sledo писал(а): нам нужен угол СВА - считаем его по теореме синусов - sinA = BC * sinB / AC. Угол упреждения равен sinA.


DbIMok писал(а):пользоваться табличкой вместо формулы в случае движения по параболе нормальный трюк. к тому же результат будет точнее, чем рассчитанный по формуле.

Хоть одно дельное замечание за неделю, я учту этот момент. Думаю результат будет не только точнее, но и быстрее.

Да и огромное спасибо за пруф. Это то что надо.
sledo
Старожил
 
Сообщения: 831
Зарегистрирован: 05 янв 2014, 15:44

Пред.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 22


cron