def smart_homing_displacement_1() -> vec.vec:
tgt_vel_vec = _get_tgt_vel_vec()
dir_v = _get_curr_tgt_coords() - _get_curr_missile_coords(missile)
A = dir_v.x
B = dir_v.y
C = dir_v.z
alpha = tgt_vel_vec.x
beta = tgt_vel_vec.y
gamma = tgt_vel_vec.z
a = (A**2 + B**2 + C**2)
b = (A * alpha + B * beta + C * gamma)
c = (alpha**2 + beta**2 + gamma**2 - missile_energy_speed**2)
discr = b**2 - 4 * a * c
if discr < 0:
return vec.vec(0, 0, 0)
half_power_discr = discr ** 0.5
a_2 = a * 2
t1 = (-b + half_power_discr) / a_2
t2 = (-b - half_power_discr) / a_2
t = max(t1, t2)
if t < 0:
print(f'WTF ?????? r<0')
return vec.vec(0, 0, 0)
x = dir_v.x * t
y = dir_v.y * t
z = dir_v.z * t
msl_vel_dst = vec.vec(x, y, z)
msl_vel_src = -tgt_vel_vec
return (msl_vel_dst - msl_vel_src).normalized() * missile_energy_speed
Проблема этого кода состоит в том, что длина найденного вектора скорости не соответствует реальной скорости ракеты (она обозначена как missile_energy_speed).
Поскольку нельзя влиять на скорость ракеты, то получается, что она берёт слишком сильное упреждение (красный след):
Спасибо за предложение.
Такой алгоритм уместен и работоспособен, но неэффективен с точки зрения расхода энергетики ракеты.
В моём случае игра претендует на некоторую серьёзность (но, конечно, не является симулятором).
1) Двигатель ракеты работает ограниченное (и очень небольшое) время, ракета сначала ускоряется, затем замедляется и обладает баллистикой
2) Манёвренность ракеты прямо зависит от скорости
3) У ракеты есть предел перегрузок
4) У ГСН ракеты ограниченное поле зрения и в случае срыва захвата она теряет цель навсегда (игровая условность)
5) Ракета имеет возможность подрываться по команде или при обнаружении цели в радиусе R
6) Вектор скорости цели/ракеты и вектор позиции цели/ракеты всегда известен и точен (игровая условность)
На эти факторы я не могу влиять.
Описанный в вопросе алгоритм хочется реализовать просто из интереса к предметной области, а не из острой необходимости.
Vindicar, Garry's Mod с аддонами на вооружение (ACF). Я пробовал оба предложенных варианта, второй даже может работать (если делать упреждение обратно пропорциональным от расстояния цель-ракета).
Мне интересен на дилетантском уровне сам принцип наведения, приближенный к использующимся в реальной жизни.
Спасибо за ответ.
Дело не в ограничении CPU, а в ограничении самой игры. Каждый игрок сервера может создавать свои программы и выполнять их (вся программа выполняется один раз за игровой такт на сервере, не на клиенте). Чтобы избежать лагов, у программ игроков есть очень серьёзные квоты на процессорное время.
Суть вопроса заключается в реализации алгоритма пропорционального сближения. При варианте A ракета всегда будет пролетать перед целью, при варианте Б ракета истратит свою энергетику задолго до попадания по цели из-за недостаточного упреждения
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Написал вот такой код
Проблема этого кода состоит в том, что длина найденного вектора скорости не соответствует реальной скорости ракеты (она обозначена как missile_energy_speed).
Поскольку нельзя влиять на скорость ракеты, то получается, что она берёт слишком сильное упреждение (красный след):
Вопрос: в чём тут может быть проблема?
P.S. геометрическое решение выглядит так: