четверг, 15 марта 2018 г.

Будь готов! Всегда готов!

Этот девиз помнят те, кто успел стать пионером во времена СССР. Я был одним из последних пионеров Советского Союза. Положа руку на сердце, скажу, что в общем-то ничего членство в пионерской организации мне не дало. К концу 80-х все это уже давно превратилось в формальность для галочки, набор ритуалов, смысл которых временами был совсем непонятен. Сама-то идея пионерской организации была неплоха, но, как всегда, подвела реализация. На этом нудное вступление считаю законченным и переходим к делу.
Пост будет коротким, не о Блендере, не об авиации, а о политике (вынужденно).
На данный момент давление на нас со стороны сами знаете кого продолжает нарастать. При этом звучат обвинения буквально во всем и не только высшего руководства страны, но и рядовых русских. Пока еще прямо не говорят в том, что мы виноваты в том, что вообще живем на этой планете, но все к тому и идет. Припоминается высказывание госпожи Тэтчер насчет того, что территория России экономически обоснована для проживания 12-15 миллионов человек. С явным намеком на судьбк остальных...
Как обычно, раз в сто лет у наших западных соседей начинается обострение.  Ныне времена другие, а сущность та же.
Высказывать свои политические взгляды, клеймит Запад и влезать в политические споры мне влом. Тем более, что переубедить собеседника в Сети невозможно- ты просто потеряешь время. Да у меня есть дела поважнее.
Учитывая сложившуюся ситуацию с ограничениями, накладываемыми на русских пользователей в том же Фейсбуке (на котором у меня нет аккаунта), а также дискриминацию русских же в том же Стиме (кому интересно, поищите информацию об игре Syrian Warfire, кажется, так она называлась), а также раздающиеся время от временеи призывы отключить Россию от мирового Интеренета, придется принять меры.
Недавно Герман Клименко, создатель сети Live Internet заявил, что Россия к отключению от мировой Сети готова. Что ж, я переношу "основную деятельность" на ЛиРу. С Гугла уходить я не буду, пока они сами не прикроют лавочку. А судя по нарастающему безумию наших соседей все к тому и идет.
https://www.liveinternet.ru/users/flogger-k/post416416506/
Пока там только переводы статей. Да и создавался дневник как резервная площадка на "всякий пожарный и при условии, что". Теперь пора преодолевать леностьи печатать свои опусы сначала там, а потом уже дублировать здесь. Да еще наверное и на компе сохранять. Мало ли...
В общем, если что, если кому-то мое творчество еще интересно - вы знаете, где меня найти в условиях Малого Песца. При Большом Песце (который, будем надеяться не придет совсем или придет через пару тысяч лет) все это уже не будет иметь никакогог значения.
P.S. А мы, оказывается, террористы, даже если не травили. https://aftershock.news/?q=node/627005
No comments

вторник, 13 марта 2018 г.

"Новые птички" и и их искусственный интеллект.

Затянувшаяся "перестройка", по-видимому, имеет все шансы не превратиться в "катастройку", как это получилось в реальном мире. Несмотря на все трудности и препятствия, процесс ползет вперед. И подтверждением тому стали две новые "птички", оживленные и подключенные к игровому процессу. Хотя, если честно, "новыми" их можно назвать именно так - в кавычках. Речь идет об F-5E Tiger и МиГ-23МС Flogger-E.
"Тайгер" был задействован еще в первой версии еще двухгодичной давности, но в данной ситуации его ведение в строй все время откладывалось на потом. Но, в конце концов, когда возниклас нужда в легком истребителе второго поколения в качестве оппонента упрощенной версии МиГ-23, я принялся спешно чинить эту машину и подключать ее к игре. Не сразу, но получилось.
Что касаемо МиГ-23МС, то это не что иное, как сильно упрощенная версия МиГ-23МФ, с авионикой от МиГ-21МФ, поставлявшаяся развивающимся странам. Тогда, в середине 70-х, промышленность еще не справлялась с массовой поставкой в войска МиГ-23М, а МФ был еще только в проекте, но советским союзникам новый самолет был нужен еще вчера.  В итоге и появился на свет упрощенный экспортный вариант со слабым, но отработанным БРЭО, увеличенным аж на полтонны запасом топлива (по причине свободного от оборудования места в закабинном отсеке), но не способный вести бой ракетами средней дальности, чье управляемое оружие ограничивалось только ракетами Р-3Р/С и Р-23М.
Отношение к МиГ-23МС довольно противоречивое - советские летчики, изображавшие на учениях "агрессора", любили этот самолет за надежность, увеличенную дальность полета и меньший, по сравнению с МиГ-23М, вес. А вот арабские пилоты, которым и приходилось на нем воевать, эту модификацию не любили за крайне слабое бортовое оборудование и отсутствие ракет средней дальности.
Но тут следует помнить, что даже хорошее оружие в неумелых руках автоматически не дает победы тому, кто воевать не умеет. Опытные летчики и на МиГ-23МС одерживали победы. Так, по сирийским данным, за все время противостояния с ВВС Израиля МиГ-23МС сбили 4 F-4E и 2 А-4, потеряв при этом 7 МиГов (1 из этих семи был сбит собственным ЗРК, два - пушечным огнем в ближнем бою с F-16, остальные - ракетами с F-15). Израильтяне яростно отрицают факты потерь, но за последнее время, глядя на все более сбоящую и стремительно глупеющую работу западных СМИ, в отсутствии потерь начинаешь сомневаться... Во время ирано-иракской войны МиГ-23МС, по данным иракцев, сбили 13 иранских машин, при собственных потерях в 12 МиГов. Правда, многие исследователи той войны считают, что на счет МиГ-23МС следует записать 5-7 побед, максимум - 9. Да и потери МиГов завышены и составляют 6 машин. А вот в Ливии МиГ-23МС себя не проявили вообще никак. Во время египетско-ливийской войны в бою с египетскими МиГ-21МФ один ливийский самолет был сбит, спустя пару летв приграничной стычке был потерян еще один МиГ-23МС. Оба раза бой вели пары и оба раза отличился один и тот же египетский летчик - полковник Сал Мухаммед, имевший немалый боевой опыт, дважды горевший в сбитом МиГ-21 в войне Судного Дня. Еще один МиГ-23МС был сбит из ПЗРК в Чаде при проведении поисково-спасательной операции после сбития и тоже из ПЗРК ливийскогог Су-22. Еще два МиГ-23МС были сбиты 4 января 1989 года американскими палубными истребителями F-14A, причем американцы упорно утверждают, что это были МиГ-23МФ с ракетами Р-23Р. На возражения, что МиГ-23МФ не смогли бы совершить столь длительный полет и вернуться, американцы отвечают, что "это были смертники", которых режим Каддафи специально послал на провокацию. Насчет провокации, пожалуй, верно, насчет смертников - вряд ли. Кстати, ливийские МиГ-23МС и БН, имевшие большой внутренний запас топлива, активно работали над Средиземным морем, и даже были случаи дезертирства в Грецию. Еще один МиГ-23МС был потерян при весьма странных обстоятельствах в Италии, летом 1980 года.
Самолеты F-5E весьма активно участвовали в ирано-иракской войне, на их счету много сбитых иракских самолетов, но их потери оказались выше. В основном, этот самолет использовался в качестве истребителя-бомбардировщика, но применялся и как охотник на вертолеты, а один раз даже сбил МиГ-25ПД. В тот раз иракский летчик сосредоточил свое внимание на паре "Томкэтов" и пропустил атаку "Тайгера" в хвост - после пушечной очереди иранский летчик увидел мощный выброс пламени- не менее 15 метров из пробитого топливного бака, после чего пилот сбитого МиГа катапультировался. Горящий самолет пролетел еще довольно большое расстояние и упал на территории Турции. Утверждается, что в Сети есть фото обломков этого самолета, но найти егл не удалось. Во время войны в Йемене один МиГ-29 южан, похоже, был сбит именно "Тайгером" северян, но информация об этом крайне скудна. Еще один интерсный штрих к судьбе F-5E - этот самолет едва не стал  основной боевой машиной ВВС Югославии - но в конечном итоге, конкурс выиграл МиГ-21. Воевали "Тайгеры" в составе ВВС Эфиопии в Огадене и не их счету есть МиГи сомалийцев.
Согласно реестру МиГ-23, в 2014 один МиГ-23МС был сбит террористами над Сирией, на момент потери машине было уже 40 лет - самолет был 1974 года выпуска. Недавно сняла с вооружения свои F-5E Мексика, фактически оставшись без авиации.
Но довольно экскурса в прошлое, вернемся в настоящее, виртуальное, правда... Я решил немного сжульничать и заодно проверить выстраиваемую мною архитектуру - в качестве кабины МиГ-23МС поставил кокпит от МиГ-23МФ, обозвав его в соответствие с моделью. Жульство прошло - кабина встала на место, как родная, Это внушает оптимизм - следовательно, при соблюдении некоторых правил, кабины в будущем легко менять, модернизировать и добавлять.
А потом пошла работа над ИИ ботов. Я условно разделил манеру поведения ботов на дальний воздушный и ближний воздушный бой - ДВБ и БВБ. Поведение бота в ДВБ предсказуемо - он выравнивается по крену в глобальных осях и направляет свой нос на цель - идет выравнивание на цель по рыску и тангажу, плюс поиск выгодной позиции для пуска ракеты. Пока нет разрешения на пуск, бот сближается с целью на форсаже, при разрешении пуска он "притормаживает" з все равно надо "подсвечивать" ракету, да и нет резона самому входить в зону пуска оппонента...
Что касаемо БВБ, то сейчас идет работа по отработке маневра "страхивания с хвоста" и создания видимости сообразительности бота - его поведение надо сделать достаточно непредсказуемым, но не пергнуть при этом палку - там еще много работы.
Ну, и в завершение - скрины - МиГ-23МС и F-5E.


воскресенье, 4 марта 2018 г.

Доводка классов. Прячем все.

Вполне закономерным итогом работы с классами стал полный переход на "внутриклассовую" работу скриптов... В конце концов, под зонтик класса перешла и работа уровней детализации и расчет поправочного коэффициента для выпуска-уборки шасси, тормозов и крыла изменяемой стреловидности. Приводить здесь скрипт класса того же МиГ-23, как представителя юнитов, у которого присутствует все вышеперчисленное, не стоит. Он довольно длинный и особо ничем не отличается от приведенных ранее. Ну, добавилось в метод движения расчет положения крыла, ну появился в классе новый метод для расчета уровня детализации. Все это чисто рабочие моменты...
Главное, что все это работает - и слава Богу, без сбоев. Пока, во всяком случае.
А потом пришел черед выполнить еще один пункт - добавить в классы оружия метод движения. И поведения заодно. Как водится первой жертвой исследования стала ракета Р-27Р. Сам ее класс был слегка модифицирован - всего с полдюжины строчек, но работа себя оправдала. Даже на фоне того, что пришлось аврально вносить коррективы во все остальные классы управляемых ракет. Заодно, кстати, дополнительно "раздробил" скрипт движения оружия, выделив из негог первый тип - ракета. Он характерен для всех типов ракет, кроме НАР. Причина - ракеты такого типа летают не по прямой, поэтому для них невозможно сделать дым одной частицей. О частицах чуть позже. Итак. Скрипт движения ракеты.

import mathutils
import random
import bge
scene = bge.logic.getCurrentScene()

def control(self):
    cont = bge.logic.getCurrentController()
    own = self
    if own.engineWeapon == 'CatapultWeapon':
        CatapultWeapon(own)
    else:
        Missile(own)
   
   
#Полет ракеты
def CatapultWeapon(own):
    if own.vzryvatel == 10:
        own.suspendDynamics
        own.engineWeapon = "Missile"

#Полет ракеты
def Missile(own):
   
    own.applyMovement([0.0,own.speed/60,0.0],True)
    own.timerAmountFire += 1
    if own.amountFire > own.timerAmountFire:
        #Срабатывание добавления частиц дыма от ракет
        own.timerSmoke += 1
        if own.timerSmoke == 1:
            #Дым снаряда
            smoke = scene.addObject('ParticleUniversal', own)
            smoke.replaceMesh("SmokeLong", True, False)
            smoke.setParent(own, False, False)
        if own.timerSmoke == 3:
            if 'ParticleUniversal' in own.childrenRecursive:
                own.childrenRecursive['ParticleUniversal'].scaleX = own.speed/360
                own.childrenRecursive['ParticleUniversal'].scaleY = own.speed/12
                own.childrenRecursive['ParticleUniversal'].scaleZ = own.speed/360
                own.childrenRecursive['ParticleUniversal'].Delta_scaleX = 0.1
                own.childrenRecursive['ParticleUniversal'].Delta_scaleY = 0.1
                own.childrenRecursive['ParticleUniversal'].Delta_scaleZ = 0.1
                own.childrenRecursive['ParticleUniversal'].Delta_colorAlpha = -0.0005
                own.childrenRecursive['ParticleUniversal'].colorAlpha = 0.2
                own.childrenRecursive['ParticleUniversal'].removeParent()
        if own.timerSmoke == 5:
            own.timerSmoke = 0
             


А теперь скрипт класса Р-27Р, который вызывает этот самый скрипт и скрипт головки самонаведения.

import bge

from ClassWeapon import typeWeapon

class R27R(typeWeapon):
       
    import Weapon_Missile as __Weapon_Missile
    import Weapon_GSN as __Weapon_GSN
   
    def __init__(self, old_owner):
        typeWeapon.__init__(self, old_owner)

    def engine(self):
        self.__Weapon_GSN.GSN(self)
        self.__Weapon_Missile.control(self)
       
def mutate(cont):
    R27R(cont.owner)
             

Ну, и собственно, функция работы оружия в игровом файле.

#Функция эффекта взрывов
def controlWeapon():
    cont = bge.logic.getCurrentController()
    own = cont.owner
    own.engine()
   

Как видно, опять "матрешка".  Так сказать, в прямом смысле - в собранной матрешке не видно внутренних составляющих. Но они есть. Как тот суслик из фильма ДМБ".
За это время я восстановил работу РЭБ, восстановил катапультирование из сбитого самолета, и, наконец, добавил огонь для сбитого. Псевдочастицами-плейнами.
А теперь по поводу частиц. К сожалению, БГЕ имеет ограничения и довольно существенные, как раз в этой области, поэтому эти меры - паллиатив. Правда, есть возможность отобрать у БГЕ почти все функции, оставив только загрузку окна и еще что-то по мелочи. Но для этого нужен другой уровень программирования, мой очень сильно недотягивает. Хотя, повторяю, часть функций БГЕ можно передать другим программам. Поэтому извращаться по поводу частиц огня, дыма, облаков и прочего я прекращаю и сосредотачиваюсь на ИИ, оружии, систем противодействия и защиты, выстраивания иерархии ботов, поиска путей и так далее. А еще, наверное, я радикально сокращу количество блоков ландшафта. Раз в 10. Схема вполне работоспособна, но ее можно и нужно оптимизировать.
Все же приведу скрипт работы частиц огня. Суть в том, что их число растет, пока не достигает определенного предела. Все частицы являются потомками и занимают свое место в списке childrenRecursive. Они расставляются на удалении от родителя согласно своему номеру в списке - чем он больше, тем дальше от родителя частица. При этом присутствует некий элемент случайности. По координатам и размерам, но в некоем диапазоне.

import random
scene = bge.logic.getCurrentScene()

#Эта переменная определяет длину "хвоса" огня
fireLong = random.randrange(8, 20)

def FireAir():
    cont = bge.logic.getCurrentController()
    own = cont.owner
   
    #Длина списка потомков
    particleLen = len(own.childrenRecursive)
   
    #Это просто списко для ускорения добавления частиц - удвоение или утроение за один проход в тик
    listObj = ["num0"]
    #listObj = ["num0","num1"]
   
    #Характеристики частицы - локация, размер и цыкт с прозрачностью
    partColor = random.randrange(2, 10)/10
    partLoc = random.randrange(particleLen, particleLen+2)
    partScale = random.randrange(particleLen, (particleLen+2)*2)/(particleLen+2)*4
   
    #Эта переменная используется для отслеживания индекса потомка в списке
    indexObj = 0
   
    #Этап1 - добавляем, парентим и раставляем частицы, отслеживая длину списка потомков
    if particleLen < fireLong:
        for newParticle in listObj:
            newParticle = scene.addObject('Plane', own)
            newParticle.setParent(own, False, False)
            newParticle.replaceMesh("FireAir_", True, False)
            newParticle.localPosition = [partLoc/10, -partLoc, partLoc/10]
            newParticle.worldScale = [partScale, partScale, partScale]
           
    #Этап 2 - работаем с тем, что есть, больше ничего не добавляем
    else:
        for obj in own.childrenRecursive:
            #Здесь переменные локации и размера используются в качестве эталона,
            #к которому подтягиваются ТТХ частиц
            indexObj = own.childrenRecursive.index(obj)
            #partLoc = random.randrange(indexObj, indexObj*indexObj*indexObj+2)
            partLoc = random.randrange(indexObj, indexObj+2)
            partScale = random.randrange(indexObj, (indexObj+2)*2)/(indexObj+2)*3
           
            #Можно поиграться с цветом и прозрачностью
            obj.color = [1.0, partColor, partColor, partColor]
           
            #Хвост пламени - локальные координаты Х
            if obj.localPosition[1] < -partLoc:
                obj.localPosition[1] += partLoc/50
            elif obj.localPosition[1] > -partLoc:
                obj.localPosition[1] -= partLoc/50 
            #Размазанность и толщина хвоста пламени - координаты Икс и Зет
            obj.localPosition[0] = partLoc/4
            obj.localPosition[2] = partLoc/4
           
         
Вот так. Хотя, все это - костыли. Пусть и работающие. Подожду пока прояснения обстоятельств с перхватом рендера и управления БГЕ. Если обстоятельства позволят, то откроются новые перспективы.