• Как оптимизировать алгоритм самонаведения ракеты?

    @atapi086 Автор вопроса
    Спасибо за развёрнутый ответ.

    Написал вот такой код
    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).
    Поскольку нельзя влиять на скорость ракеты, то получается, что она берёт слишком сильное упреждение (красный след):
    65e35e5b4f134591082641.png

    Вопрос: в чём тут может быть проблема?

    P.S. геометрическое решение выглядит так:
    65e35eec91ced373872812.png
    Написано
  • Как оптимизировать алгоритм самонаведения ракеты?

    @atapi086 Автор вопроса
    Спасибо за предложение.
    Такой алгоритм уместен и работоспособен, но неэффективен с точки зрения расхода энергетики ракеты.
    В моём случае игра претендует на некоторую серьёзность (но, конечно, не является симулятором).
    1) Двигатель ракеты работает ограниченное (и очень небольшое) время, ракета сначала ускоряется, затем замедляется и обладает баллистикой
    2) Манёвренность ракеты прямо зависит от скорости
    3) У ракеты есть предел перегрузок
    4) У ГСН ракеты ограниченное поле зрения и в случае срыва захвата она теряет цель навсегда (игровая условность)
    5) Ракета имеет возможность подрываться по команде или при обнаружении цели в радиусе R
    6) Вектор скорости цели/ракеты и вектор позиции цели/ракеты всегда известен и точен (игровая условность)
    На эти факторы я не могу влиять.
    Описанный в вопросе алгоритм хочется реализовать просто из интереса к предметной области, а не из острой необходимости.

    По этим причинам предложенное решение не подходит
    Написано
  • Как оптимизировать алгоритм самонаведения ракеты?

    @atapi086 Автор вопроса
    Vindicar, Garry's Mod с аддонами на вооружение (ACF). Я пробовал оба предложенных варианта, второй даже может работать (если делать упреждение обратно пропорциональным от расстояния цель-ракета).
    Мне интересен на дилетантском уровне сам принцип наведения, приближенный к использующимся в реальной жизни.
    Написано
  • Как оптимизировать алгоритм самонаведения ракеты?

    @atapi086 Автор вопроса
    Спасибо за ответ.
    Дело не в ограничении CPU, а в ограничении самой игры. Каждый игрок сервера может создавать свои программы и выполнять их (вся программа выполняется один раз за игровой такт на сервере, не на клиенте). Чтобы избежать лагов, у программ игроков есть очень серьёзные квоты на процессорное время.
    Суть вопроса заключается в реализации алгоритма пропорционального сближения. При варианте A ракета всегда будет пролетать перед целью, при варианте Б ракета истратит свою энергетику задолго до попадания по цели из-за недостаточного упреждения
    Написано