{{notification.text}}

MirGames

Почетный ламер :)
11.03.08 14:32
0
Данно:
-расстояние до цели L
-начальная скорость снаряда V
-сопротивлением воздуха пренебрегаем
Отсюда:
горизантальная составляющая скорости Vx:=V*sin(alpha)
вертикальная составляющая скорости Vy:=V*cos(alpha)
горизонтальная составляющая скорости постоянна на протяжении всего полета снаряда
x:=x+Vx
вертикальная составляющая скорости уменьшается на (Асв пад) каждую ед. времени
Vy:=Vy-Adown
y:=y+Vy
все вроде правильно. и летит симпатично.
тепперь вопрос: как правильно целиться?
т,е как зная: L,V,Adown найти <alpha>?
#1
Mirage
11.03.08 16:05
0
Уравнение составить и решить.
x = Vx * t = V*Cos(a) * t;
y = g*t^2 + Vy*t = g * t^2 + V*Sin(a) * t

Два уравнения, две неизвестных (t, a).
#2
Почетный ламер :)
11.03.08 16:32
0
что-то составил и решил- чушь получается....


L=V*cos(a)*t
0=g*t^2+V*sin(a)*t
----------------------------------------------------------
в первом выражении
выражаем t через а
чтобы избавиться от него совсем
t=L/(V*cos(a))
а обе части второго выражения поделим на t
0=g*t+V*sin(a)
----------------------------------------------------------
0=g*L/V*cos(a)+V*sin(a)


блин, как отсюда выразить альфу?
Отредактировано: 11.03.08 17:36
#3
11.03.08 18:14
0
При условии, что ты пишешь что-то наподобие "танчиков" можно воспользоваться методом которому учат в артеллеристских училищах вооруженных сил РФ :)

1. Зная дальность до объекта вычисляем базовые установки для стрельбы по заранее расчитанным таблицам (т.к. воздухом пренебрегаем - это проще, в таблице только два столбца - дальность и угол, ветер не учитывать) - V = Vnom (номинальная скорость снаряда для этой дальности)
2. Производим выстрел и результат по типу "недолет/перелет".
3. По таблице опять же смотрим, что для заданной дальности мощность добавлять нужно на dV. V1 = Vnom + dV.
4. Снова стреляем с тем же результатом.
5. а. Если получили "перелет" вместо "недолета - уменьшаем в половину прирощение мощности и меняем его знак, V2 = V1 - dV/2 (аналогично для "недолета" при предыдущем "перелете").
б. если вновь "недолет" то V2 = V1 + dV
7. Продолжаем половинить результаты до тех пор, пока цель не будет поражена.
Это кстати неплохой алгоритм для AI, и сбивать прицел не особо нужно :)
#4
Почетный ламер :)
11.03.08 18:34
0
в общем метод подбора мне в голову приходил. у меня правда нет мощности, есть только угол ствола и начальная скорость. это характерристики орудия, верннее второе характеристика а от первого зависит дальность. начинал с Pi/4 и постепенно уменьшал угол.
но там по формулам все тоже на время полета завязано. и точного расчета не получается. в результате подбор неожиданно дает то поолное зависание программы, то невероятные углы. люди ну неужели никто этого не делал?
Отредактировано: 11.03.08 18:37
#5
Почётный лектор
11.03.08 18:47
0
Цитата(Murzik18 @ Сегодня, 14:34)
[snapback]77322[/snapback]
в общем метод подбора мне в голову приходил

Приведенное выше уравнение легко решается. Подобную задачу буду решать на этой недели, о результатах, если не забуду, расскажу.
#6
Mirage
11.03.08 18:48
0
Я делал в Scorch an Island. Задачу с учетом ветра решал точно и сразу. Только давно.:)
Непонятно откуда ты взял такое решение. Вообще-то обычное квадратное уравнение должно получиться. С от нуля до двух корней.
Сейчас времени нет, через пару часов напишу как решать.
Отредактировано: 11.03.08 18:48
#7
Почётный лектор
11.03.08 18:50
0
Цитата(Murzik18 @ Сегодня, 12:32)
[snapback]77317[/snapback]
0=g*L/V*cos(a)+V*sin(a)


блин, как отсюда выразить альфу?


V*sin(a)=-g*L/V*cos(a);
sin(a)/cos(a) = -g*L/V^2
a = arctan(-g*L/V^2)

Цитата
Непонятно откуда ты взял такое решение

Кстати, да. ИМХО, неправильный изначальный посыл. У тебя разложено на горизонтальную и вертикальную составляющую скорости - это правильно. Но почему у тригонометрических функций один (тем более константный!) аргумент?

В общем, решу, когда понадобится, задачу - расскажу как.
Отредактировано: 11.03.08 18:53
#8
Почетный ламер :)
11.03.08 19:54
0
это начальные параметры вылета снаряда. с какого перепугу им быть разными и не константными?
#9
Mirage
11.03.08 21:28
0
Вобщем я решал такую задачу:
Даны координаты пушки и цели (2D). Сила притяжения g. Траектория баллистическая.
Надо найти угол наклона пушки и силу выстрела (начальную скорость).
Касательно угла - вообще сперва берется текущий если не достреливаем, то ставим 45 градусов к горизонту (так дальше всего летит).
Немного формул:

Движение по X (равномерное): x = Vx0*t
Vx0 = V * Cos(a) - начальная горизонтальная скорость, t - время
Время сравнивания по горизонтали с целью: Vx0*t = Xцели => t = Xцели / Vx0

Движение по Y (равноускоренное): y = a*t2/2 + Vy0*t + Y0
a - ускорение, Vy0 = V * Sin(a) - начальная вертикальная скорость, Y0 - высота пушки.
Время сравнивания по высоте с целью получается из решения данного квадратного уравнения.

Подставляя предыдущее t и решая его, получаем, что
Vx0 = Xцели * Sqrt(a/2 / (Yцели - Y0 - tg(a) * Xцели) )
Power = Vx0 / cos(a)

Power - модуль начальной скорости.
Наверное можно и угол найти, зная Power: cos(a) = Vx0/Power
#11
Почетный ламер :)
12.03.08 14:34
0
Universal
попробовал это решение на практике- фигня получается. и вообще тангенс в овете меня сильно смущает. по идее должно быть 2 ответа один меньше pi/4 другой больше и один=pi/4 при L=максимальной дальности стрельбы.
чтение ссылки убивает желание с этим заморачиваться


Отредактировано: 12.03.08 14:43
#12
Почетный ламер :)
15.03.08 16:00
0
сделал проверялку для алгоритмов. пока лучше всех работает этот код:
Код


Function GetCanonAngle2 (L,g,V:double):double;
var t,tempL:double;
    tempA,caseA,dL,casedL:double;
    step1:double;
    i:integer;
begin
casedL:=100;
caseA:=pi/4;
tempA:=pi/4;
step1:=(pi/4)/90;
for i:=0 to 89 do
begin
tempA:=(pi/4)+(step1*i);
t:=(V*sin(TempA))/g;
t:=t+4;//поправка на высоту пушки
TempL:=V*cos(TempA)*2*t;
dl:=abs(L-TempL);
if dl<casedl then
    begin
    caseA:=TempA;
    casedl:=dl;
    end;
end;
GetCanonAngle2:=-caseA;
end;


код пока жутко неоптимален, зато как прверка идеи очень нагляден и оставляет простор для творчества. вообще нужно будет еще подумать....
Отредактировано: 15.03.08 16:02
#13
Почётный лектор
15.03.08 20:30
0
Да, решил задачку на работе. Так вот - настоящая, физическая баллистика подкачала. Суть вот в чем. Шарахнуть можно очень разными способами - например под 45градусов и с одной силой или под 89градусов - с другой. Можно исходить из проекций начальной скорости - там свои варианты. Проблема в том, что в любом случае приходится что-то брать "априори". Например, я всегда стреляю под углом в 45 градусов. Но все такие предположения имеют ограничения - то есть стрельба перестает работать в каких-то случаях.

Я сделал проще - взял уравнение параболы y = -alpha*x^2 + kx + b (с обобщением на 3D). При этом k и b вычисляются (зная две точки, через которых проходит парабола - точка стрельбы и точка цели). Коэффициент alpha при этом можно считать универсальным (то есть берем, скажем, alpha = 0.01 и все работает). Но его можно вариировать исходя из разных параметров - например, чем дальше цели, тем меньше alpha. Или с учетом факта, что траектория не должна пересекать объекты. Такой вот фейк, который хорошо работает.
#14
Mirage
15.03.08 22:21
0
Т.е. вместо того, чтобы просто решить уравнение, решаем задачу полным перебором? Грустно...

Universal: Баллистика в порядке. ;)
Я правильно понял, что снаряды у тебя принудительно летят по этой параболе? Или что ты с ней потом делаешь?
#15
Почётный лектор
16.03.08 04:04
0
Цитата(Mirage @ Вчера, 18:21)
[snapback]77568[/snapback]
Я правильно понял, что снаряды у тебя принудительно летят по этой параболе?

Правильно. Полетом снарядов я управляю сам. Так что слово "принудительно" тут звучит странно.

Цитата(Mirage @ Вчера, 18:21)
[snapback]77568[/snapback]
Баллистика в порядке

Конечно, в порядке. О проблемах с ней связанных в коде я сказал. Если бы задача подобрать свободные коэффициенты в формулах баллистики была приемлимой по сложности, было бы замечательно. Но как раз это и составляет проблему. То есть проблему-то если вдруг припрет решить можно, но для задач "красивно запустить камнем в дом" - излишне и слишком сложно.
#16
Mirage
16.03.08 05:44
0
Цитата
Правильно. Полетом снарядов я управляю сам. Так что слово "принудительно" тут звучит странно.


По физическим законам это одно, а по параболе это уже практически по заданной траектории. Не физика, а скорее анимация.

Цитата
О проблемах с ней связанных в коде я сказал. Если бы задача подобрать свободные коэффициенты в формулах баллистики была приемлимой по сложности, было бы замечательно. Но как раз это и составляет проблему. То есть проблему-то если вдруг припрет решить можно, но для задач "красивно запустить камнем в дом" - излишне и слишком сложно.


В посте №10 описано точное решение. Не сказал бы, что сложное.
Проблемы, что ты описал не вижу. Все четко, уравнение квадратное, решений от 0 до 2. Одно на подъеме, другое на снижении снаряда. Если решение одно, то, видимо верхняя точка траектории попадает на цель.
Что касается свободных коэффициентов - ты об угле? Сам же говоришь, что под 45 градусов стреляешь. И это работает, как правило. Я оставляю текущий угол, т.к. все время пушку на 45 вертеть тупо в игре смотрится.
Если под 45 градусов не решается (у меня, к примеру ограничена начальная скорость сверху и снизу, или гора мешает), то пробуем другие углы (тоже просто понять понижать или повышать угол).

Хотя с параболой ты практически тоже самое делаешь, т.к. она есть график движения снаряда. alpha смело приравнивай к ускорению свободного падения, в k - к V * Cos(a).:)
Ну и чтобы найти b и k надо такое же вобщем-то квадратное уравнение решить.
Отредактировано: 16.03.08 05:53
#17
Почётный лектор
16.03.08 14:45
0
Цитата(Mirage @ Сегодня, 01:44)
[snapback]77589[/snapback]
о пробуем другие углы (тоже просто понять понижать или повышать угол).

Перебором чтоли O_o?
В realtime коде? Подбирать перебором углов? Ну, это, извините меня... Жесть!

Цитата(Mirage @ Сегодня, 01:44)
[snapback]77589[/snapback]
alpha смело приравнивай к ускорению свободного падения

А вот и фиг! Такие числа дают очень вертикальную тракторию. То есть шарашим под углом, близким к 90 градусам.
Тут дело в том, что в баллистических формулах аргументом выступает время, а у меня координаты (вернее, удаление по (XY) от точки выстрела).

Правда, что у меня задача не физическая, а анимационная, да. И несложно вывести четкиие формулы для расчета alpha. С углами все значительно труднее. Тоже надо много всякого учитывать, но а alph'у оно отображается прямым понятным образом, а как оно влияет на угол посчитать у меня так и не удалось. Перебор не рассматривается.
Отредактировано: 16.03.08 14:51
#18
Mirage
16.03.08 14:57
0
Цитата
В realtime коде? Подбирать перебором углов? Ну, это, извините меня... Жесть!


Зачем перебор? Посчитать для максимум трех углов.
#19
Почётный лектор
16.03.08 15:33
0
Цитата(Mirage @ Сегодня, 10:57)
[snapback]77602[/snapback]
Посчитать для максимум трех углов.

К примеру?
#20
Mirage
16.03.08 17:20
0
Я делаю так: сперва текущий угол, затем, если не долетаем - 45 градусов. Если опять не долетаем, то и не долетим. Если перелет, ставим угол около 80 (при желании можно точно аналитически посчитать).
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}