![]() |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Цитата:
Код:
Function ObjTest:Object() |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Благодарю
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
А за способ спасибо. Всё заработало. |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Очередной трабл.
Пишу мини-ИИ для "баллистического бота" если можно так сказать Суть в том, что он должен выстрелить снарядом в объект, но в точку в которой объекта ещё нет. То есть должен просчитать траекторию движения цели, и выстрелить туда, где объект будет через t итераций (обновления объектов) Вот что известно на входе: Начальные координаты цели (X1,Y1) Скорость цели (V1) Направление движения цели (угол) (a1) Начальные координаты бота (X2,Y2) Скорость снаряда бота (V2) Вот что нужно найти Угол выстрела (a2) Через сколько t они встретятся (t) За одну итерацию координаты цели обновляются следующим образом X1 = X1+(V1*Cos(a1)) Y1 = Y1+(V1*Sin(a1)) Выпущенный снаряд выходит из точки X2,Y2, и за одну итерацию обновляет свои координаты похожим образом используя скорость V2 и угол направления движения который мы должны найти a2 Снаряд летит только туда, куда его направили, никакие больше силы на снаряд не действует. А Бот стоит на месте. Вариант решать перебором (начиная от 1 итерации и просчитывать столкнулись или нет - не подходит, так как сейчас именно так и делается и это не дело =)))) В принципе меня устроит только число t в данном случае. Буду знать t, буду знать угол. В данный момент уже читаю и книгу по физике для комп. игр и краткий курс тригонометрии. Но пожалуйста, помогите если кто знает. |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Цитата:
дистанция = | координаты_цели - координаты_бота | время_полета_снаряда_по_прямой = дистанция / скорость_снаряда упрежденные_координаты_цели = координаты_цели + скорость_цели * время_полета_снаряда_по_прямой а если нужен именно угол, используй ATan2 с разностью упрежденных_координат_цели и координат_бота |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Цитата:
Но если цель подвижна (с постоянной скоростью и углом направления) данный алгоритм уже не годится. Ибо сначала надо расчитать куда стрелять чтобы они столкнулись Цитата:
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Greymem
вот такой итеративный алгоритм вроде работает: 1) расчетная_позиция = позиция_цели 2) дистанция = |расчетная_позиция - позиция_бота| 3) время_полета = дистанция / скорость_снаряда 4) упрежденная_позиция = позиция_цели + скорость_цели * время_полета пункты 2,3,4 повторить несколько раз некогда все грамотно расписывать, поэтому глянь эту говнодемку:) при 5 итерациях ~60% попаданий, но это из-за того что цель отскакивает от стен, т.е. меняет направление когда выстрел уже произошел. Код:
SuperStrict |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Найс, очень полезно и прикольно.
Не понятно только зачем нужен цикл. =) Код:
For Local ComputingPass:Int = 1 To 5Мистика =) К сожалению в данном примере направление X и Y довольно сильно различаются. Как сделать те-же самые расчеты используя только одну переменную направления? - Сделано Как установить угол выстрела на координату я уже знаю Осталось заранее узнать координату в которой они столкнуться. - Сделано. Вот переделал на использование одного поля "Direction" для пули Правда подлагивает, подёргивает (интересно из-за чего?) Но вроде работает, ХЗ, может ещё что неправильно, посмотрите плиз. Код:
SuperStrict |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Цитата:
ты хоть читаешь что я пишу или сразу код копипастишь? Цитата:
Цитата:
Цитата:
Иначе говоря в коде расчета, перед циклом, был такой расчет скорости цели: Код:
Local TargetVelocityX:Float = TargetDirectionX * TargetSpeedКод:
Local TargetVelocityX:Float = Sin(TargetAngle) * TargetSpeedЦитата:
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
А какая гарантия того, что на 5-ом шаге цикла расчеты будут точнее чем на 3-ем?
Код уже готов, вверху. Можете глянуть, что не так? |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
И еще, при
Const TargetSpeed:Float = 3 и скажем Const BulletSpeed:Float = 4 Снаряд пулю уже не догонит, хотя мы меняли только скорость цели. Снаряд должен подстраиваться под цель по-идее |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Цитата:
Вообще чем выше скорость пули относительно скорости цели, тем меньше итераций потребуется. Цитата:
Цитата:
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Цитата:
Что-то ещё упустили? |
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Вот что получилось, на случай, если кому-нибудь понадобится
Код:
SuperStrict |
| Часовой пояс GMT +4, время: 10:51. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot