Показаны сообщения с ярлыком aircraft. Показать все сообщения
Показаны сообщения с ярлыком aircraft. Показать все сообщения

пятница, 8 сентября 2017 г.

Бюрократия. Ревизионизм. Реанимация. Тестирование. Су-25. И снова про blf - избавление от кракозябр.

Следующим после МиГ-27К к реанимации был назначен Су-25. Работа выдалась вполне рутинной. Сначала. А вот потом вдруг всплыла нерешенная еще в пераой версии проблема - кабина Су-25, которую я перенес во вторую версию, была меньше требуемых размеров. Произошло это из-за ошибки в моделировании Су-25 в первой версии. Тогда я вывернулся с оверлейной сценой и благополусно забыл об этом. во второй версии из-за ряда новых нюансов подобная халява не прокатила и пришлось кабину "увеличивать". А вместе с ней и остальные детали - индикаторы, стрелочки и тд. Также пришлось подгонять названия деталей под единый стандарт и править текст скрипта работы приборов. Попутно выяснил, что можно UV-скроллинг задавать из единого центра, называя имена объектов в скрипте - все равно мешей у них в списке всего один. по-видимому, придется все кабины зачистить от лишней логики работы курвиметров и вообще потихоньку оптимизировать скрипты, перечислив газвания стрелочек в "шапках" модулей. Ну, ладно, не в первый раз оптимизирую.
Пришлось повозиться с json для Су-25. Постоянно выплывала ошибка в строке с данными сенсора. В конце концов мое терпение лопнуло и я ее заменил на строчку из другого json, подкорректировав цифры. Ошибка пропала. Что это было я так и не понял.
Установил в кабине прицел АСП-17, про который я писал уже в своем блоге здесь, но пока толком не тестировал.
Большую работу пришлось проделать с меню. Серией различных ухищрений мне удалось достичь того, что теперь текст может более-менее точно располагаться на кнопке, а не только рядом с ней, он может быть русским или английским, иметь определенный цвет и прозрасность. К сожаленпию, смена текстур в 2.78 была таки сломана, да и видеотекстура теперь работает странно... Так что смена заставок в меню была сделана через замену мешей, зато раотает железно.
Наконец, с подсказки dron-а, были ликвидированы жуткие кракозябры вместо русского текста. Понятно, что во всем была виновата кодировка. преодолевается это так:

 with open(bge.logic.expandPath('//Menu/StartMenu.json'), 'r', encoding = 'utf-8') as directMenu:
        JSONmenu = json.load(directMenu)

В данном случае encoding = 'utf-8' - это убийца кракозябр. Русский текст после этого нормально воспринимается и читается в БГЕ и можно его пропечатать на экране хоть в текстовом объекте, хоть в blf. Кстати о последнем. Я уже писал о выведении текста на экран. У меня работают текстовые метки целей (наконец-то получилось отсечь цели позади активной камеры),  но надо было обязательно сделать меню справку о клавишах и командах. Приводить весь текст json, пожалуй, не буду, он длинный и однообразный. Приведу строчку с разъяснением структуры, хотя, там скорее всего и так будет более-менее поянтно.

"str1":{"az":35,"buki":45,"vediR":1.0,"vediG":1.0,"vediB":1.0,"vediA":1.0,"strX":0.01,"strY":0.975,
        "textRus":"Команды","textEng":"Option"},
"str2":{"az":35,"buki":45,"vediR":1.0,"vediG":1.0,"vediB":1.0,"vediA":1.0,"strX":0.01,"strY":0.95,
        "textRus":"+ - увеличение тяги двигателя","textEng":"+ - Engine power plus"}

Хотя нет, не все. Тут еще дело упирается в мой специфический юмор. Недолго думя, я обозвал переменные сами видите как. az и buki - это размер текста. vedi с заглавными буквами - это цвет и прозрасность текста - RGBA, strX-Y- координаты начала строчки на экране. Далее понятно - русский и английский текст. Дело в том, что я постепенно наращивал число ключей в словаре json, не зная толком, что понадобится в работе - в итоге вот так и получилось. Хотя можно и упростить.
Как бы то ни было, меню стало более вменяемым и происходит его сборка-пересборка при смене разделов. у меня не было ни малейшего желания громоздить кучу сцен ради меню, надеюсь, удастся итоговую сцену тоже не делать, а возвращаться в сцену с меню.
И да, наконец удалось ввести в сцену террайна наземную цель - бункер, взаимодействие которого при попадании оружия еще надо как-то отработать - обрушение, разлет обломков там...
Пока меню имеет пять миссий - для МиГ-23МФ и МиГ-29  это перехват Ф-16 и Ф-15 соответственно. Для Су-25, МиГ-23БН и МиГ-27К  я противников из воздуха убрал, но оставил в качестве цели бункер. Надо попробовать ввести МЗА и СЗРК. В первой версии МЗА "Эрликон" был, надо перетаскивать. Плюс "Стрела-1" и БРДМ-2, но их текстурить надо. Когда-то я сделал модель БМП-1. Ее надо избавить от высокополигональных катков и гусениц, посмотреть, что можно упростить и туда же, тем более, она была затекстурена...
В общем, продолжим...
Ниже скрины - нельзя же совсем ез картинок - Су-25 и его кабина. Подвешены по две пары блоков С-8 и бомб ФАБ-250, плюс пара ракет Р-60М.


среда, 26 июля 2017 г.

Бюрократия. Ревизионизм. Реанимация. Тестирование. МиГ-27К.

Практически все дни, которые протекли со дня позапрошлого поста (не прошлого, а позапрошлого) я занимался бюрократией. А последние дней пять-шесть реанимацией МиГ-27К.
Первоначально я несколько офигел от объема предстоящей работы. Предстояло переписать, дописать, написать или ипоправить уйму json  вооружения для F-15/16, Су-25 и МиГ-27К. Для последнего их написать надо было с нуля, как и файл инициализации с боевыми характеристиками "двадцать седьмого". А еще реанимировать кабину, всадив туда СПО-15 с вытекакющими из этого доделкой скрипта кабины и переделкой скрипта МиГ-27К. Поскольку  у того имеются свои специфические особенности в виде шестиствольной пушки и меньшей скорости, чем у МиГ-23 при всей их схожести.
Впрочем, медленно и методично все json были переписаны - работа в принципе, несложная, но занудная. Может быть, в будущем, я что-нибудь придумаю либо для автоматизации процесса, либо для ликвидации такого большого их числа. Сколько я их написал-дописал-переписал-поправил - сказать затрудняюсь. Много. Особенно для F-16. Поскольку у того богатый набор ракет типа "воздух-земля". Ну ничего, после появления в наборе ракет X-23/25/27 и МиГ-27 с Су-25 тоже основательно разбогатеют...
После написания json тестовой миссии для МиГ-27К последовал отлов ошибок через провреки валидности json - в интеренете  такие инструментоы есть.
А потом пошла проверка-доводка модели МиГ-27К и его кабины. Кстати, кабину пришлось еперсобрать, поскольку БГЕ и Блендер матерятся на старые dds (тут я сам виноват - надо было указывать способ компрессии dxt1 и конвертить с png аддоном в ГИМПе).  Но все же ругань консоли прекратилась, как и выражения по поводу ненайденных объектов. Это первый этап. Второй этап состоит из реанимации телевизионного прицела в кабине, обеспечение прицеливания ракетой "воздух-воздух" с использованием непосредственно ТГСН ракеты (такой опции у меня пока нет, но она обязательна к исполнению, поскольку в жизни даже внешне безобидные турбовинтовые самолеты или учебные спарки типа Л-29 с минимальным набором оборудования на борту такие ракеты использовать могут и представляют угрозу для боевых реактивных машин). Также необходимо приступать к работе по земле и дописыванию ИИ ботов для атак наземных целей с учетом достижений первой версии. как бы ни был примитивен тогдашний мой ИИ, боты довольно уверенно поражали танки, ЗРК и артиллерию, порой сами получая в ответ.
Ниже приведен скрин тестирования МиГ-27К. Еще предстоит отладить стрельбу из пушки и написать в файле инициализации встроенную РЭБ, но самолет уже летает и несет оружие. Что уже хорошо...

А здесь для ознакомления приведен json для ракет Р-27А на первой паре подвесок  МиГ-29.
{"pathBlend":["//Weapon/R-27A/R-27A.blend","//Weapon/FLC_PilonR1_/FLC_PilonR1_.blend","//Weapon/FLC_PilonL1_/FLC_PilonL1_.blend"],
 "pathJSON":{"R-27A":"//Weapon/R-27A/R-27A.json",
             "FLC_PilonR1_":"//Weapon/FLC_PilonR1_/FLC_PilonR1_.json",
             "FLC_PilonL1_":"//Weapon/FLC_PilonL1_/FLC_PilonL1_.json"},
   
"obves":{
         "FLC_PilonR1_|":{"parentObj":"CntAircraft","locObj":[2.241,-1.004,0.094],"rotObj":[0.0,0.0,0.0]},
         "FLC_PilonL1_|":{"parentObj":"CntAircraft","locObj":[-2.241,-1.004,0.094],"rotObj":[0.0,0.0,0.0]},
         "R-27A|1":{"parentObj":"CntAircraft","locObj":[-2.24, -1.6, -0.18],"rotObj":[0.0,0.0,0.0],"weapon":1},
         "R-27A|2":{"parentObj":"CntAircraft","locObj":[2.24, -1.6, -0.18],"rotObj":[0.0,0.0,0.0],"weapon":1}
         }
}

Расшифровка довольно проста. Список pathBlend показывает пути к файлам блендов - пилонов и ракет, которые надо открыть. Словарь pathJSON показывает, какие надо открыть джейсоны с ТТХ оружия и пилонов. В этом словаре перечисляются названия пилонов и ракеты в данном случае - одной ракеты, левого и правого пилона. В словаре obves (термин стырен из терминологии стрелков) идет перечисление названий объектов, их координат, поворота (часто ракеты размещаются под некоторым углом, но иногда без поворота), объект в модели, к которому надо прицепмить ракету или пилон. Отдельно для ракет предусмотрена переменная weapon - это номер повески вооружения. Не всегда он совпадает у всех, есть смешанные варианты подвески ракет, как, к примеру Р-24Р+Р-24Т на поздних вариантах МиГ-23. Плюс иногда необходим  катапультируемый сброс - ракета сначала отделяется от самолета и только потом включается двигатель. Это характерно для полуутопленных ракет на F-4/14/15 или МиГ-31. В этом соучае в джейсон в строчку с оружием после weapon добавляется переменная CatapultSbros. Что сигнализирует о том, что ракета сперва должна слегка "просесть" и только потом лететь.
В общем, на данный момент, дела обстоят на такой стадии...

понедельник, 28 ноября 2016 г.

И снова - записки бюрократа...

Давно я так плотно не работал с Geany... поскольку на подходе нарисовался F-15 Eagle, а характеристики многочисленных AIM-7/9/120 зияли пустотой, оставленные на потом, пришлось срочно  набивать джейсоны для этих (и не только) ракет "воздух-воздух". Помимо американских ракет я "раздал слонов" также нашим, плюс английским, французским, итальянским и израильским УРВВ (про английские зря я написал во множественном числе, потому как присутствует только одна ракета - Skyflash).
Работа велась по принципу "эталона". Брался аналог той или иной модели другой страны и по прикидкам и характеристикам в монографиях и всевозможных вики печатались ТТХ, в том числе скорость реакции слежения, устойчивость к помехам и тд. Понятно, что кроме дальности и скорости с массой ракеты, все остальные данные брались в общем-то "от балды", но джейсоны хороши тем, что если очень надо, достаточно открыть файл и изменить в нем нужные цифры, причем в строчке понятно, о чем идет речь.
В результате были "осчастливлены" ракеты следующих семейств:
Р-3/13/60/73/33/37/40/27/77/98/23/24,
AIM-7/9/120,
Python3/4/5,
Shafrir1/2,
Skyflash,
Matra Super 530D/F,
MICA-EM/IR,
Aspide Mk1/2,Matra R550 Magic.
Все? Кажись, все. Нет ракет типа Р-4, юаровских "Кукри", китайских PL-7/9/12 и шведских клонов. Ах да, еще есть "Метеоры" и "Ирис-Т", общеевропейские, так сказать. АМРАМ - 8 штук, Р-27 - 7 штук, "Сайдуиндеров" - около 15, дюжина (или уже больше?) - "Спэрроу". Много в сумме, короче получается.
А далее наступил черед подключения Ф-15... Сначала пришлось подправлять имена в файле модели. Затем спешно писать json для баков и пилонов самолета, поскольку БГЕ пребывал в недоумении, пытаясь понять, что от него хотят. Потом новый юнит вдруг полетел хвостом вперед и вниз, причем скорость начала приближаться к субсветовой... Как оказалось, у одной детали не был убран статки в настройках, а поскольку она оказалась внутри кубика-двигателя, тот попытался ее "выплюнуть" и "подавился". Наконец "Игл" полетел прямо вперед и строго по горизонтали. Включил внешнюю камеру обзора. Тому, что я увидел, в русском языке соответствует цензурное слово "фигня" (но есть много других, не столь благозвучных и начинающихся на "х"). Ракеты, баки и летчик сдвинуты вперед и вверх. Причем фигура летчика парит в воздухе перед носовым обтекателем.
Сначала я подумал, что где-то переборщил со шкалой потомков. Проверил - все норамльно. После нескольких попыток понять, что это было, отложил на сегодняшнее утро. Как оказалось, утро действительно мудренее вечера. Ошибку нашел почти сразу - несовпадение центра промежуточного потомка с нулевыми координатами. После чего вновь запустил тест и с гордостью пронаблюдал результат:

Сегодня успел основательно поработать над моделью F-16C, для которой теперь надо сделать текстуры формата dds и изменить скрипт (обычно я беру аналогичный скрипт из другого бленда и его изменяю под новую модель).
Что касаемо кабин, то здесь дела обстоят не столь радужно. Если центральную панель "Игла" еще как-то более-менее похожей на оригинал сделать можно, то с боковыми - просто беда. Для F-16 все обстоит гораздо лучше, подробных панелей и схем гораздо больше. Вероятно, придется делать версии кабин, а потом их обновлять по мере улучшения качества картинки.

Сегодня

аСе


четверг, 1 сентября 2016 г.

Реинкарнации.Новое слово в бортовых номерах.

Постараюсь набрать этлт пост без ошибок - пытаюсь освоить десятипальцевый метод набора текста. Получается со скоростью пока нешибко, нонадо когда-то начинать.
Пока идет работа по возврашению моделей из первой вермии встрой. В первую очередь это касается кабин. Ничего особо нового нет, кроме скрипта работы приборов, да текстуры там теперь работают в формате dds. Введен строй МиГ-23МЛД, готовится МиГ-27К...
Давно назревал вопрос с бортовыми номерами. Так уж получилось, что у меня действоало жесткое ограничеие по количеству номеров - 16 штук и не более. Номера представляли собой плейны с цифрами, меши которвх подменяли постоянный обьект CntAircraft. Но я помнил о возможностях UV-скроллинга и мне хотелось эти возможности использовать. В конце концов решение было найдено. Сам бортовой номер в моем случае - строковое проперти, состояшее из цифровых симвлов. UV-скроллинг предусматривает сдвиг развертки вправо-влево (по оси Х), и вверх-вниз(по оси Y). Отыскав в своих закромах заготовки бортовых номеров, приступил к созданию так называеемых стилей - текстур цифр от 0 до 9, обьединенных в строчки. В принципе можно было использовать всего одну и применять цвет объекта к материалу. И получить люьой цвет цифр. Однако существуют варианты номеров с кантом (обводкой по контуру) и их довльно много - и тут цвет объекта неприменим. Поэтому в итог у меня получились три стиля бортовых номеров в 6 вариантах - белый(без канта), контурный белый кант, прозрачный внутри и 4 варианта с обводкой - красный, желтый, синий и черный. Полученные варианты по моим прикидкам, перкрывают пока весь нужный мне диапазон - что натовский, что сербский, что наш, что ливийский стандврты.
Далее пошла реформа генерации бортового номера - теперь бортовой номер в комплекте к модели идет один, но состоит он  из объектов, число которых равно длине номера, к примеру, "541" - три объекта - numObj0-1-2, последний символ в имени - номер симола в последователности цифр. В данном случае - 5 - 0 , 4-1 и 1-2.  А далее следует алгоритм сдвига развертки. У нас 10 цифр, значит одно "деление" сдвига - 0.1, а цифра, извлекаемая из последовательности номера, указывает, насколько надо сдвинуть развертку. Привожу кусок кода. Надеюсь, мысль понятна.
   
 #ЭТОТ БЛОК ФОРМИРУЕТ НОМЕР ЮНИТА, ВЫБИРАЯ ЧИСЛА В ПРОМЕЖУТКЕ, УКАЗАННОМ В ФАЙЛЕ JSON
            #Ограничения слева и справа по номеру
            limitLeft = dataJSON["listBortNumber"][0]
            limitRight = dataJSON["listBortNumber"][1]
            
            numberUnit = random.randrange(limitLeft,limitRight)
            if numberUnit not in bge.logic.globalDict["importMesh"]:
                if numberUnit not in bge.logic.globalDict["importMesh"]:
                  
 if numberUnit < 10:
#для номеров типа 01,02.03 и так далее
                        unitNew['unitNum'] = '0' + str(numberUnit)
                    else:
                        unitNew['unitNum'] = str(numberUnit)
                    bge.logic.globalDict["importMesh"].append(numberUnit)
           
            #Далее идет выдача бортовых номеров
            for numObj in unitNew.childrenRecursive:
                #В названии составляющих бортового номера присутствует numObj
                if 'numObj' in numObj.name:
                    #Далее выбирается конкретная цифра в номере
                    number = int(numObj.name[-1])
                    sdvigUVplane = int(unitNew['unitNum'][number])  
                    mesh = numObj.meshes[0] 
                    array = mesh.getVertexArrayLength(0)
                    for k in range(0,array):
                        vertex = mesh.getVertex(0,k)
                        UV = vertex.getUV()
                        #Сдвиг УВ-сколиинга вправо на нужное деление
                        UV[0] = UV[0] - sdvigUVplane/10
                        vertex.setUV(UV)

плейн номера знает, какая цифра в номере ему нужна, извлекает ее, преобразует в число и сдвигает свою развертку на нужное деление. Максимальная длина бортового номера - 5 символов (ирак и Югославия), обычно 2-3 (мы и натовцы), реже - 4 - (Сирия, ЧССР, Ливия). Номера теперь в json юнитов задаются ограничениями слева и справа, типа 'listBortNumber':[0, 100].
Кстати о джейсонах. Файлы эти размножились и прочно обосновались как в файлах юнитов, так и в файлах оружия и стало их много. они выполняют стартовую работу - раздают проперти, парентят объекты, располоагают их и разворачивают, как надлежит. Для всех МиГ-23 работа над файлами джейсонов закончена, кроме МиГ-27, но и для них осталось лишь определить положение ракет Р-60, может быть по мере добавления новых видов оружия будут создаваться дополнительные json, но это дело еще впереди.
Пока что результат с бортовыми номерами и json установки оружия...
 МиГ-23МЛД, бортовой номер "31 красный" При первом пробном запуске был "24 крачный".
 Ливийский МиГ-23МФ, бортовой номер трудно разглядеть - запускал несколько раз, номер менялся типа 4782 или 4753 черный.
А это - эксперимент с json МиГ-23БН ВВС Ливии - кроме трех ПТБ - по паре РБК-500 и РБК-250, плюс пара ОФАБ-250 на хвостовых балках.

пятница, 19 августа 2016 г.

Контрольный выстрел. Анимации больше нет...

Как-то довольно быстро после последнего сообщения и боях с форматом json, было восстановлено все. Кроме текстовой индикации на кокпите, которую я намереваюсь рисовать через blf. К сожалению, то ли я удалил файлик с заготовкой, то ли запихнул его куда-то, но теперь придется это дело поновой начать, благо что образец скрипта я скопировас АПИ Блендера.
Все эти дни методично занимался подчисткой и сортировкой того, что уже было сделано и дописывал требующееся. Была восстановлена пушечная и ракетная стрельба, как УР, так и НАР, аварийный сброс подвесок, сброс топливных баков и бомб. Поскольку мои руки еще не добрались до кода со стрельбой я еще толком ничего не успел поломать, чтобы потом героически восстанавливать мною же порушенное. Так, переделал немного имена проперти в коде, поскольку лазить по json и исправлять там было влом.
Долго и тщательно "приглаживал" кокпит. В общем сама картина не поменялась - ноэто внешне. Хотя кое-какие видные глазу ихменения все же произошли. Я наконец добрался до стрелочек угла атаки, угла сноса и перегрузки. Эти стрелки у меня были фактически для декорации в первой версии, теперь у них функция несколько ближе к реальной. Поскольку изменения претерпела сама модель полета, появилась "боковая" составляющая и "вертикальная" составляющая. Это как имитация "заноса" машины на повороте. Только машину, по большому счету ведет влево-вправо, а самолет еще и вверх-вниз. Отдаю себе отчет в том, что деление "боковых" и "вертикальных" скоростей сноса на линейную скорость самолета это не аэродинамика, но все же лучше, чем ничего. Таким образом яполучил угол атаки, угол сноса и перегрузку (сумму "боковой" и "вертикально" составляющей, деленную на скорость машины). Пришлось повозиться с выставлением коэффициентов для ограничения работы стрелок, чтобы не вертелись как попало, но оно того стоило. Затем пришло время разбить приборы и индикаторы на группы объектов и создать в скрипте отдельные функции типа dvigInd, chassyInd, wingsInd и так далее. Все эти функции вызываются лишь при изменении текущих данных - выпуска-уборки тормозов-шасси-закрылков, изменении тяги двигателя и так далее. В итоге сама функция Cockpit в одноименном скрипте превратилась в своеобразный коммутатор, для вызова функций работы индикаторов и стрелочек. Индикаторов у меня что-то около 40 штук, плюс что-то около 20 стрелок. Все это хозяйство ныне исправно функционирует и выдает нужну. информацию.
После того, как кокпит МиГ-23МФ был отлажен и выловлены все ошибки и недочеты, занялся изничтожением оставшейся анимации. Дело Термидора должно было быть доведено до конца...
Как выяснилось, "глаз боится, руки стучат по клаве",  необходимо было убрать анимации из гидравлики и стоек шасси - всего - 16 объектов. Дело осложнялось тем, что некоторые объекты имели весьма сложную траекторию движения, по ходу исполнения самой анимации направление движения могло измениться на противоположное.
Тем не менее проблема была решена с помощью if own==blabla: own=bla. Я просто разбил участки работы проперти CHASSY на интервалы, внутри которых менялись скорости и направления движения. Пока, на мой взгляд, строчек многовато, но в будущем, надеюсь, и здесь часть строчек будет убрана. Пока работает и ладно. Что мне и нужно было. Таким образом, анимации в файлах модели больше нет. Совсем.
Возможно, что в 2.78 баг с проигрыванием анимации уже поправили,  но пока не проверял. Да и по большому счету, уже пока и не нужно.
Есть еще кое-какие фишки в Блендере, до которых пока руки не доходят. Так, есть возможность смешения текстур (декали, бортовые номера, имитация повреждений), но все это пока перекрывается тем, что объекты, добавленные в сцену через addObject, имеют одинаковый материал, поэтому и выглядеть будут одинаково...
В общем, пока вот так. Джейсон прочно утвердился в проекте (оказывается, есть еще кое-какие возможности, надо их изучить), анимация в модели и в кабине полностью убрана (это привело к уменьшению файлов примерно на 20 процентов), кабина отлажена полностью, за исключением прицела (не в кого пока целиться, Ла-17 взял из старого проекта, заодно выяснил, откуда там прозрачность и вывернутость полигонов - в настройках материала не отключил Transparency), работает оружие, механизация, стрельба и взрывы. Надо готовить мишени и на них отрабатывать до конца модель повреждений и воздействие оружия, плюс прицел и сенсоры.

пятница, 10 июня 2016 г.

Явно верной дорогой идем, товарищи...

Есть какая-то мистическая взаимосвязь между успешным кодингом и отключением света в моем доме... уже давно заметил, чт стоит создать солидный кусочек нового кода и приготовить солидный задел на будущее, как наши доблестные энергетики гасят свет. Причем надолго. Бывает это нечасто, но совпадения с успешным продвижением  по проекту настораживают)))... Как это было вчера. После некоторой возни я отладил пуски НАР, одиночные пуски ракет типа "воздух-воздух" и приготовился реализовать пушечный огонь, как последовало отключение (давненько такого не было, чтобы на 8 часов). В иоге вчерашний день был потерян.
Сегодня опять занялся оружием и сделал огонь из пушки. А к аркетам присобачил факел огня. Ничего особо сложного там не оказалось, разве что отработал вызов функций из другого скрипта - примитивно, но работает. В начале работающего скрипта пику - import moduleclass
А потом в нужном месте - moduleclass.blablabla(). То есть пишу, какую функцию надобно использовать из загруженного модуля moduleclass. Как всегда, нужные мысли не всегда приходят в нужное время. Что мешало в первой версии  таким образом разбить на функции хотя бы тот же искусственный интеллект ботов и спокойно вызывать нужную функцию в зависимости от ситуации? Но лучше поздно, чем никогда... Пока у меня таким образом работают функции сброса и пуска, плюс функции смены оружия, я сейчас пока стараюсь побыстрее создать "скелет" игры, создавая код в меру своего умения и сопровождая его подробным комментарием, чтобы потом при совершенствовании не вспоминать, чего я там нагородил. ну и стараюсь, чтобы объем поменьше был у пускового файла.  Относительно недавно один пользователь БУ, с которым я списался в ВК, любезно продемонстрировал мне, как можно мыслить абстракциями и что из этого можно извлечь. С помощью Питона. Результат впечатляющий, и, после завершения работы над основной частью кода, я, скорее всго, начну пробовать 2мыслить абстрактно", что должно привести к резкому сокращению кода и должно повысить скорость. К тому же он меня предупредил, что реализованный в БГЕ ныне метод мутации объекта (после создания класса) не совсем оптимален и может вызвать утечку памяти при определенных условиях.  Если честно, я пока в мутации разбираюсь слабо, но это дело придется поправлять.
Пока что на данный момент имеем пуски неуправляемых ракет, сбросы бомб, и пуски пока еще болванок, которые должны стать управляемыми ракетами. Плюс пушка. Из крайне неоходимых операций добавления объектов мне осталось реализовать алгоритм отстрела тепловых ловушек, а также дымные следы. Есть предположение, что можн7о будет добавить дымные шлейфы и к НАРам, от которых я был вынужден в первой версии отказаться. Есть у меня анимированная текстура длинного дыма, которую я и использую. Частица дыма для НАР будет одна- ее длина будет расти сообразно скорости ракеты,а потом частица будет 2отцепляться" от ракеты с исчезновением факела огня и быстро таять... Таким образом, БГЕ не должен сильн перегружаться при массовых пусках ракет. Что касаемо УР большой дальности, то для них дымный след останется тем же, но в алгоритм добавления частиц дыма будет добавлено выставление длины частицы сообразно скорости ракеты. Также это правило будет действовать и для отстреливаемых ложных целей 9ловушек). В первой версии неестественность дыма бросалась в глаза на малых скоростях самолета. К тому же УР будут набирать скорость слежения за целью плавно, а не рывком, как в первой версии - из-за этого "ломаность" линии дыма также бросалась в глаза.
После завершения работы над отстрелом ловушек и дфмами можно будет приступать к возвращению и совершенствованию самонаведения для ракет, а потом очередь дойдет и до бронепробиваемости под разными углами для разных типов снарядов... Работы много еще. а вот после завершения "скелета" игры и отработки взаимодействия объектов уже можно клепать модели и разнообразить технофауну. В первой версии примерно так и было, с той лишь разницей, что новые объекты там добавлялись с большим скрипом. Надеюсь, в этот раз такого безобразия не будет.
А теперь - красивые картинки (ну как красивые, довольно приешиеся, поди уже, с пустнным пейзажем и МиГ-23)...

 Пуск Р-23Р

 Пушечный огонь






 Залп НАРами
 Сброс бомб

вторник, 3 мая 2016 г.

Горячая пора-5. Снова бубен и танцы...

Заимев кое-какой опыт игростроения и программирования, со своей колокольни могу сказать, что самое пакостное в этом деле - выработка стандартов. Нет речь не идет о вещах типа формата кодировки типа Юникод или UTF-8(хотя очередной неожиданный облом с кодировкой заставил меня сильно пожалеть, что не существует одного раз и навсегда установленного стандарта кодировки, по крайней мере тогда  можно было бы не опасаться "взбрыков" Винды).
Стандарты в игростроении это некая сакральная вещь, к которым приходишь после долгих размышлений, проб, ошибок и разного рода неожиданностей, иногда столь же забавных, сколь и зловредных.
Целых три дня я пытался сообразить, с какого перепугу у меня не генерятся одинаковые подвески оружия на разных пилонах. Потом было выявлено "узкое место". Потом был применен метод "против лома нет приема, если нет другого лома"... В общем, очередные танцы с бубном. Однако по порядку.

Все варианты подвесок для того или иного юнита, а также его стартовые значения свойств (типа ТТХ, БРЭО и дополнительных объектов у меня прописаны в текстовом файле с именем - "ИмяЮнита_Нация_Инит" формата txt. Это именно что текстовый файл, только весьма своеобразного наполнения. Для подвесок вооружения строчки в нем имеют вид:
P|1|1-R-60-4|FLG_APU602W_|0.0025|0.034
P|1|1-R-60-4|R-60|-1.428|-0.81|-0.01|-0.0175|0.0|0.0|1|0.01|0.043|1|60|s3
P|1|1-R-60-4|R-60|1.428|-0.81|-0.01|-0.0175|0.0|0.0|1|0.01|0.043|1|60|s3
P|1|1-R-60-4|R-60|-1.66|-0.81|0.17|-0.0175|1.575|0.0|1|0.01|0.043|1|60|s3
P|1|1-R-60-4|R-60|1.66|-0.81|0.17|-0.0175|-1.575|0.0|1|0.01|0.043|1|60|s3
P|2|2-R-60-4|FLG_APU602F_|0.0025|0.034
P|2|2-R-60-4|R-60|-0.47|-0.21|-1.0|-0.0175|0.0|0.0|2|0.01|0.043|1|60|s3
P|2|2-R-60-4|R-60|0.47|-0.21|-1.0|-0.0175|0.0|0.0|2|0.01|0.043|1|60|s3
P|2|2-R-60-4|R-60|-0.7|-0.21|-0.71|-0.0175|1.575|0.0|2|0.01|0.043|1|60|s3
P|2|2-R-60-4|R-60|0.7|-0.21|-0.71|-0.0175|-1.575|0.0|2|0.01|0.043|1|60|s3

В данном случае после буквы Р и разделительной черты следует индекс пары подвески (первая, вторая...), затем следует куча других значений - координаты местонахождения, тип изменяемого меша, повороты объекта при появлении, вес, лобовое сопротивление и так далее... Замечу только, что сначала записи типа 1-R-60-4 и ей подобные выглядели так -  R-60-4. На подобное извращение пришлось пойти из-за весьма любопытного нюанса. Маленького такого нюанса... И зловредного.
Для того, чтобы не плодить кучу проперти типа пойнтВеапон1, пойнтВеапон2  и так далее, в отличие от первой версии у меня существует лишь одно такое проперти, тоже строковое и имеет оно вид (точнее имело вид) - 'FuelTank-3_R-60-4_R-60-4'. Чтобы получить список вооржения я эту строку преобразовал в список матодом
if weapon != 'No_Weapon':
        #То режем значение проперти по списку   
        weaponList = list(weapon.split('_'))

При распечатке списка получилось ['FuelTank-3','R-60-4','R-60-4']
Казалось бы, радуемся жизни. Генерация оружия у меня идет методом перебора символов в текстовом файле (как раньше писал):
#то заглядываем в файл
    for string in directClass:
        #Срез строки по маркеру |
        config = string.split('|')
        #Эта строка, с начальным символом # - комментарий и ее читать не надо
        if config[0] == '#':
            continue
     
        #Это означает, что строка относится к подвеске оружия
        elif config[0] == 'P' and weapon != 'No_Weapon':
            #Далее сравниваем значение названий вооружения и их ИНДЕКСА в списке weaponList, потому что
            #названия подвеско могут совпасть, а вот и названия и номера одновременно - нет.
            for obj in weaponList: 
                #print(weaponList.index(obj))
                if obj == config[2]:
                    #Это название МЕША, который следует загрузить из бленда
                    importObj = config[3]
                    #НЕ ПУТАТЬ НАЗВАНИЯ ПОДВЕСКИ  И МЕША ТРЕБУЕМОГО ОБЪЕКТА, ПОТМУ ЧТО ПОДВЕСКА МОЖЕТ БЫТЬ СМЕШАННОЙ
                  
                    if importObj not in bge.logic.globalDict["listLoadObj"]:
                        bge.logic.LibLoad('//Weapon/' + importObj + '/' + importObj + ".blend",'Mesh',load_actions = False)
                        bge.logic.globalDict["listLoadObj"].append(importObj)
                    #В строчках подвесок указываются пилоны подвески, но для них проперти веапон
                    #задаваться не будет - ни к чему, зато число объектов-ракет и бомб определяется числом строчек
                    newM = scene.addObject('UniversalMesh', own)
                    newM['meshs'] = config[3]
                    newM.setParent(own.parent, False, False)
                    #После парентинга и замены мешей раздаем координаты ракетам и бомбам
                    if 'APU' not in importObj:
                        if 'Pilon' not in importObj:
                            if 'Fuel' not in importObj:
                                newM.localPosition[0] = float(config[4])
                                newM.localPosition[1] = float(config[5])
                                newM.localPosition[2] = float(config[6])
                                newM.applyRotation([float(config[7]),float(config[8]),float(config[9])],True)
                                newM['weapon'] = int(config[10])
                                newM['antiForce'] = float(config[11])
                                newM['massChild'] = float(config[12])
                                newM['childBK'] = int(config[13])
                                newM['textWeapon'] = config[14]
                                newM['tipSbros'] = config[15]
                            #Зато у топливного бака есть емкость
                            elif 'Fuel' in importObj:
                                newM.localPosition[0] = float(config[4])
                                newM.localPosition[1] = float(config[5])
                                newM.localPosition[2] = float(config[6])
                                newM['fuel'] = float(config[7])
                                newM['antiForce'] = float(config[8])
                    #Для пилонов и АПУ предусмотрено лобовое сопротивление, как идля топливных баков, ракет и бомб
                    elif 'APU' in importObj:
                        newM['antiForce'] = float(config[4])
                    elif 'Pilon' in importObj:
                        newM['antiForce'] = float(config[4])
По окончании всего этого закрываем текстовый файл и ликвидируем генератор (мавр сделал свое дело). Сбольшим удивлением обнаружил, что генерится у меня только одна пара подвесок, причем ДВА РАЗА. то есть я вижу-то одну пару подвесок - с четырьмя Р-60, но их там ВОСЕМЬ и ДВА ПИЛОНА, они "вложены2 друг в друга. вот тут я и завис... Перепробовал разные способы, ничего не помогало. причем вроде как алгоритм-то верный - фигура летчика, баки, все это прекрасно работало. Ошибка была выявлена и оказалась весьма странной. Снова смотрим:if weapon != 'No_Weapon':
        #То режем значение проперти по списку   
        weaponList = list(weapon.split('_'))

Перед этим я исправил в текстовом файле R-60-4 и аналогичные строки на 1-R-60-4 и так далее. Думал, если дополнительно указать номер подвески перед ее названием, то это сработает.
Посмотрел на список:
 ['FuelTank-3','R-60-4','R-60-4']
После манипуляций с резкой и преобразованием проперти в список с учетом ИНДЕКСА полученных элементов в списке должно было пропечататься:
  ['0-FuelTank-3','1-R-60-4','2-R-60-4']. А вот получилось:
['0-FuelTank-3',1-'R-60-4','1-R-60-4'].
Теперь понятно, почему первая пара подвески генерилась дважды, а второй не было вообще? Я специально распечатал строковые значения индекса списка и получил 0,1,1. А должно было быть 0,1,2. Как у всех нормальных людей. Видно чего-то опять "гениальное" сотворил, талант у меня на такие вещи, м-дааааа...
Тогда я решил поступить по-простому, по пролетарски. Раз эта ошибка появляется при одинаковых названиях оружия на подвеске, значит, надо эти названия сделать неодинаковыми. Как хорошо, что я еще не добрался до меню, а экспериментирую, жестко задав значение проперти в исходном скрипте... Я просто поменял вид 2оружейного2 проперти на 0-FuelTank-3_1-R-60-4_2-R-64.
Против лома нет приема. Скрипт послушно проглотил наживку. И имеем результат:

Танцы с бубном продолжаются, denis8424 предложил просто задать значения подвески "справа-налево", причем для всех точек, что позволит сделать индивидуальные подвески. В том числе и асимметричные. Со своей стороны, кажется додумался, как выбирать оружие, несколько упростив эту процедуру, заодно это позволит не переключаться при наличии одинаковых вооружений на разных парах подвески. Выбор оружия должен производиться не по номеру подвески а по названию самого оружия. Правда, это дело еще надо обдумать...

воскресенье, 17 апреля 2016 г.

Горячая пора-3. Танцы с бубном.

Начнем с цитаты. Она подходит к нынешнему положению дел.
"""– Интересная работа?
– А разве бывает неинтересная работа?
– Да, конечно… И чем же вы занимаетесь?
– Я занимаюсь структурным анализом. Но учтите, Саул, я отрешился от земного. Давайте я расскажу вам еще что-нибудь про тахоргов.
– Да нет, благодарю вас, про тахоргов не надо. Лучше расскажите, как вы работаете.
– Саул, я же сказал, что отрешился.
– Ну как же это так – отрешился? Что же, вы теперь совсем не думаете о работе?
– Наоборот. Все время думаю. Я всегда думаю о той работе, которой занят в данный момент. Сейчас я суперкарго и второй пилот – это на тот случай, если у Антона вдруг случится отложение солей. Впрочем, об этом я, кажется, уже… Так вот, мне сейчас очень хочется пойти и немножко поводить «Корабль».
– Да вы еще успеете поводить! И потом я прошу рассказать не о сущности вашей работы, а о внешней форме, так сказать… Вот вы приходите на работу. Обычные трудовые будни…
– Хорошо. Будни. Я ложусь на вычислитель и думаю.
– Ну-ну… Постойте – на вычислитель? Ну да, понимаю. Вы лингвист, и вы ложитесь на… И что же дальше?
– Час думаю. Другой думаю. Третий думаю…
– И наконец?..
– Пять часов думаю, ничего у меня не получается. Тогда я слезаю с вычислителя и ухожу.
– Куда?!
– Например, в зоопарк.
– В зоопарк? Отчего же в зоопарк?
– Так. Люблю зверей.
– А как же работа?
– Что ж работа… Прихожу на другой день и опять начинаю думать.
– И опять думаете пять часов и уходите в зоопарк?
– Нет. Обычно ночью мне в голову приходят какие-нибудь идеи, и на другой день я только додумываю. А потом сгорает вычислитель.
– Так. И вы уходите в зоопарк?
– При чем здесь зоопарк? Мы начинаем чинить вычислитель. Чиним до утра.
– Ну, а потом?
– А потом кончаются будни и начинается сплошной праздник. У всех глаза на лоб, и у всех одно на уме: вот сейчас все застопорится, и начинай думать сначала.
– Ну, ладно. Это будни. Однако же нельзя все время работать…
– Нельзя, – сказал Вадим с сожалением. – Я, например, не могу. В конце концов заходишь в тупик, и приходится развлекаться.
– Как?
– Как придется. """
А. и Б. Стругацкие "Попытка к бегству"

Дорого бы я дал за такую возможность валяться на вычислителе и думать. Имеется в виду, конечно квазибиологический комп с мыслеуправлением. Глаза не напрягать, на скрипящем и кряхтящем раздолбанном кресле не сидеть...
Иногда я бываю непробиваемо тупым. Особенно, если начинаю освоение чего-нибудь нового. Потом, как обезъяна, начинаю копировать и ставить что-то уже наработанное, но не понимаю до конца, как оно работает. Потом следует "щелчок" и новая порция навыков укладывается в москХ. При этом я вполне способен вынести мозг тем, кто меня наставляет на путь истинный. Те, кто читает эти строки, наверняка поймут, о чем речь...
В прошлом посте я выложил куски кода по стартовой загрузке семейства МиГ-23/27. Осталось дело за малым - научиться не только генерить объекты, но и менять им меши. После серии брани со стороны консоли об отсутствующих мешах и неправильных путях и опечатках, наконец свершилось страшное. Стали генериться и появляться подвесные баки. Повернутые на 90 градусов. Долго мне еще будут икаться "проклятые Блендером меши". При импорте файла в формате обж внешне все выглядит благопристойно, но нельзя забывать, что в графе "поворот по Х" стоит 90 градусов. То же самое случилось с пилонами. Исправил. Баки есть, бомб и остального нет. Опять начал танцевать с бубном. Принтом вывожу список потомков. Есть. Пути к мешам (блендам)? Правильно, все на месте. Где оружие?! Принт в файл контроля юнита на игровой сцене. Что за хрень? Только баки! открываю скрип генерации объектов в "самолетном файле". Диагноз серьезен, прогноз печален. Припаренчивание мешей ракет и бомб идет к самому генератору, который исчезает, выполнив свою миссию. а надо цеплять к родителю генератора - фюзеляжу. Добавляю .parent к self. Открываю игру, запускаю. ура! Все на месте. Но... А где левый блок с НАР? Ну да, конечно, там парент не проставлен... Исправил. Снова запуск и я вижу МиГ-23БН в полном обвесе - три ПТБ, по паре Б-8, ОФАБ-20 и ФАБ-100. Слава Высокому Небу!
Вообще-то я рассчитывал генератор объектов сделать единым в игровой сцене, но при вызове класса там встречаются свои нюансы - имя класса надо формировать с помощью модуля sys. А кроме этого, есть еще функция самого класса. Вчерашний вечер был убит на попытки изощриться и сделать подобное. Заодно чуть не был сведен с ума мой добровольный помощник (да и я сам чувствовал себя не очень ... комфортно). В итоге пока сделал загрузку оружия старым способом через генератор в самом самолетном файле. Есть у меня подозрения, где я мог лопухнуться, но пока еще не проверял. может и не лопухнулся, а просто честно ломился в открытую дверь (так уже бывало - смотрим посты по разметке квадратов ландшафта).
Ну а пока что имеем  полный обвес, и способ генерации, по-видимому, будет изменен еще раз. Путем загрузки данных из тестового фала со всеми координатами, поворотами, массой, лобовым сопротивлением... вот так вот рождаются и мгновенно устаревают файлы. Результат этого устаревшего файла:

суббота, 16 апреля 2016 г.

Горячая пора - 2. Записки бюрократа.

Пару дней назад сдуру удалил файл МиГ-23БН. Теперь вот думаю, а может не сдуру. Как сказал Диего Марадона, забив мяч англичанам рукой: "Мою руку направлял сам Бог". Учитывая, что совсем недавно перед этим матчем Аргентина огребла от британцев на фолклендских, то бишь Мальвинских островах, кое-какие основания для этих слов у него были (обида аргентинцев не прошла с тех пор). Ну, может быть, мою руку направляла Высокое Небо (читаем Валентинова). В том файле содержался начатый мною стартовый класс для семейства МиГ-23 и МиГ-27. Обычно я всегда проверяю содержимое корзины перед удалением, но тут почему-то не стал. Может, к лучшему.
Позавчера я этот файл восстановил, вчера написал класс FLG_, то бишь FLOGGER_, в котором помимо расстановки вооружения, указал конкретные технические характеристики для разных модификаций. Какие-то модификации почти не отличаются, какие-то отличаются сильно. я бы не сказал, что файл полностью закончен, потому что в нем пока отсутствуют характеристики БРЭО, вроде дальности действия радара, его угла обзора, времени сканирования и пр.
Тем не менее, прописывание всего этого заняло весь день, потому что везде надо было менять own на self, прописывать другие имена и тому подобное. В несколько приемов я с этим справился. Та же участь ждет остальные модули первой версии для МиГ-29, Су-25, F-15, F-16 и F-5.  Про модули для новых машин я не говорю, потому что добавляться они будут с новыми машинами. вообще же класс FLG_ выглядит примерно так:
стартовые характеристики:
class FLG_(bge.types.KX_GameObject):   
    def __init__(self, old_owner):
        if self.parent.parent['unitName'] in ['MiG-23MF','MiG-23M']:
           
            #Если этот юнит управляется игроком, то выставляем камеру пилота в кабине в нужную позицию
            if.self.parent.parent['bot'] == 0:
                Gor = scene.objects["Gor"]
                Gor.localPosition = [0.0, 3.0, 0.56]
           
            if 'PilotObj' not in bge.logic.globalDict['listLoadObj']:
                #Вызов и установка фигуры пилота
                bge.logic.LibLoad('//Aircraft/PilotObj.blend', 'Scene', load_actions = False)
                bge.logic.globalDict['listLoadObj'].append('PilotObj')
           
            pilot = scene.addObject('PilotRus', self.parent)
            pilot.setParent(self.parent, False, False)
            pilot.localPosition = [0.0, 2.85, 0.25]
           
            #Пушка ГШ-6-30 для МиГ-27
            if 'MiG-27' in self.parent.parent['unitName']:
                pushka = scene.addObject('UniversalMesh', self.parent) 
                pushka['meshes'] = 'GSh630'     
                pushka.setParent(self.parent, False, False)
                pushka.localPosition = [0.0,1.4,-0.675]
           
            #Вначале выдаем ограничения по маневренности, высотности, скорости и прочим ТХ
            self.parent.parent['speedMax'] = 694 #максимальная скорость
            self.parent.parent['heightMax'] = 17500 #потолок
            self.parent.parent['MaxPower'] = 12.5 #максимальная  тяга двигателя
            self.parent.parent['speedVert'] = 220 #максимальная вертикальная скорость
            self.parent.parent['angX'] = 0.8 #максимальная угловая скорость тангажа
            self.parent.parent['angY'] = 1.3 #максимальная угловая скорость крена
            self.parent.parent['angZ'] = 0.3 #максимальная угловая скорость рыска
            self.parent.parent['rotatDyn'] = 0.1 #динамичность угловых скоростей
            self.parent.parent['dvigDyn'] = 4 #динамичность двигателя
            self.parent.parent['speedDyn'] = 5 #динамичность скорости
            self.parent.parent['startSpeed'] = 1.0 #стартовый коэффициенот скорости
            self.parent.parent['maxFuelSpeed'] = 1.8 #максимальный расход топлива кг в секунду
            self.parent.parent['massFuelOwn'] = 4090 #внутренний запас топлива
            self.parent.parent['unitChassy'] = 'E_' #тип шасси
            self.parent.parent['ownECM'] = 0.1 #встроенная система РЭБ - эффективность
        elif self.parent.parent['unitName'] == 'MiG-23MS':
            #Вначале выдаем ограничения по маневренности, высотности, скорости и прочим ТХ
            self.parent.parent['speedMax'] = 694 #максимальная скорость
            self.parent.parent['heightMax'] = 17500 #потолок
            self.parent.parent['MaxPower'] = 12.5 #максимальная  тяга двигателя
            self.parent.parent['speedVert'] = 220 #максимальная вертикальная скорость
            self.parent.parent['angX'] = 0.8 #максимальная угловая скорость тангажа
            self.parent.parent['angY'] = 1.3 #максимальная угловая скорость крена
            self.parent.parent['angZ'] = 0.3 #максимальная угловая скорость рыска
            self.parent.parent['rotatDyn'] = 0.12 #динамичность угловых скоростей
            self.parent.parent['dvigDyn'] = 4 #динамичность двигателя
            self.parent.parent['speedDyn'] = 5 #динамичность скорости
            self.parent.parent['startSpeed'] = 1.0 #стартовый коэффициенот скорости
            self.parent.parent['maxFuelSpeed'] = 1.8 #максимальный расход топлива кг в секунду
            self.parent.parent['massFuelOwn'] = 4590 #внутренний запас топлива
            self.parent.parent['unitChassy'] = 'E_' #тип шасси
            self.parent.parent['ownECM'] = 0.05 #встроенная система РЭБ - эффективность
        elif self.parent.parent['unitName'] == 'MiG-23BN':
            #Вначале выдаем ограничения по маневренности, высотности, скорости и прочим ТХ
            self.parent.parent['speedMax'] = 694 #максимальная скорость
            self.parent.parent['heightMax'] = 18500 #потолок
            self.parent.parent['MaxPower'] = 12.5 #максимальная  тяга двигателя
            self.parent.parent['speedVert'] = 220 #максимальная вертикальная скорость
            self.parent.parent['angX'] = 0.8 #максимальная угловая скорость тангажа
            self.parent.parent['angY'] = 1.3 #максимальная угловая скорость крена
            self.parent.parent['angZ'] = 0.3 #максимальная угловая скорость рыска
            self.parent.parent['rotatDyn'] = 0.13 #динамичность угловых скоростей
            self.parent.parent['dvigDyn'] = 4 #динамичность двигателя
            self.parent.parent['speedDyn'] = 5 #динамичность скорости
            self.parent.parent['startSpeed'] = 1.0 #стартовый коэффициенот скорости
            self.parent.parent['maxFuelSpeed'] = 1.8 #максимальный расход топлива кг в секунду
            self.parent.parent['massFuelOwn'] = 4590 #внутренний запас топлива
            self.parent.parent['unitChassy'] = 'E_' #тип шасси
            self.parent.parent['ownECM'] = 0.05 #встроенная система РЭБ - эффективность

Здесь отнюдь не все модификации - а то слишком много места уйдет. А теперь кусочек кода по вооружению:

#Генерация вооружения
            if self.point9 != 'pusto':
                #Добавление топливных баков
                if self.point0 in ['FuelTank-1','FuelTank-3']:
                    ptbCnt = scene.addObject('UniversalMesh', self)
                    ptbCnt['meshes'] = 'FLG_FuelTank_Center_'
                    ptbCnt['fuel'] = 800.0
                    ptbCnt.setParent(self.parent, False, False)
                    ptbCnt.localPosition = [0.0,-1.13,-1.04]
                if self.point0 in ['FuelTank-2','FuelTank-3']:
                    #Левый подвесной бак
                    ptbL = scene.addObject('UniversalMesh', self)
                    ptbL['meshes'] = 'FLG_FuelTank_Wing_'
                    ptbL['fuel'] = 800.0
                    ptbL.setParent(self.parent, False, False)
                    ptbL.localPosition = [-2.67,-1.76,-0.1]
                    #Правый подвесной бак
                    ptbR = scene.addObject('UniversalMesh', self)
                    ptbR['meshes'] = 'FLG_FuelTank_Wing_'
                    ptbR['fuel'] = 800.0
                    ptbR.setParent(self.parent, False, False)
                    ptbR.localPosition = [2.67,-1.76,-0.1]
           
            #Генерация вооружения
            if self.point1 != 'pusto':
               
                #Добавление оружия
                #Ракеты средней дальности для МиГ-23
                if self.point1 in ['R-23R+R-23T','R-24R+R-24T','R-24RM+R-24T','R-24R','R-23R','R-24RM','R-24T','R-23T']:
                    #Пилон стандартный для всех вариантов
                    pilon1 = scene.addObject('UniversalMesh', self)
                    pilon1.setParent(own, False, False)
                    pilon1['meshes'] = 'FLG_APU23_'
                    #Ракет две штуки всегда, расположение - одинаковое
                    weaponMesh1newObject1 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject1.setParent(self, False, False)
                    weaponMesh1newObject2 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject2.setParent(self, False, False)
                    weaponMesh1newObject1.localPosition = [-1.428,-2.0,0.03]
                    weaponMesh1newObject1.applyRotation([-0.035,0.0,0.0],True)
                    weaponMesh1newObject2.localPosition = [1.428,-2.0,0.03]
                    weaponMesh1newObject2.applyRotation([-0.035,0.0,0.0],True)
                   
                    if self.point1 in ['R-24R','R-23R','R-24RM','R-24T','R-23T']:
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = self.point1
                        #При симметричной подвеске нет вопросов и по второй ракете
                        weaponMesh1newObject2['weapon'] = 1
                        weaponMesh1newObject2['meshes'] = self.point1
                       
                    #Смешанная подвеска   
                    elif self.point1 == 'R-23R+R-23T':
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = 'R-23R'
                        #При смешанной подвеске вторая ракета получает другие значения проперти и меша
                        weaponMesh1newObject2['weapon'] = 3
                        weaponMesh1newObject2['meshes'] = 'R-23T'
                    elif self.point1 == 'R-24R+R-24T':
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = 'R-24R'
                        #При смешанной подвеске вторая ракета получает другие значения проперти и меша
                        weaponMesh1newObject2['weapon'] = 3
                        weaponMesh1newObject2['meshes'] = 'R-24T'
                    elif self.point1 == 'R-24RM+R-24T':
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = 'R-24RM'
                        #При смешанной подвеске вторая ракета получает другие значения проперти и меша
                        weaponMesh1newObject2['weapon'] = 3
                        weaponMesh1newObject2['meshes'] = 'R-24T'
       
       
                #Ракеты Р-3Р, Р-3С, Р-13М и Р-13М1      
                elif self.point1 in ['R-3R','R-3S','R-13M','R-13M1']:
                    weaponMesh1newObject1 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject1.setParent(self, False, False)
                    weaponMesh1newObject1['weapon'] = 1
                    weaponMesh1newObject1['meshes'] = self.point1
                    weaponMesh1newObject2 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject2.setParent(self, False, False)
                    weaponMesh1newObject2['weapon'] = 1
                    weaponMesh1newObject2['meshes'] = self.point1
                    #Это расположение ракет на пилонах МиГ-23
                    if 'MiG-23' in self.parent.parent['unitName']:
                        weaponMesh1newObject1.localPosition = [-1.428,-1.57,0.027]
                        weaponMesh1newObject1.applyRotation([-0.0175,0.0,0.0],True)
                        weaponMesh1newObject2.localPosition = [1.428,-1.57,0.027]
                        weaponMesh1newObject2.applyRotation([-0.0175,0.0,0.0],True)
                        pilon1 = scene.addObject('UniversalMesh', self)
                        pilon1.setParent(self, False, False)
                        pilon1['meshes'] = 'FLG_APU13W'
                    #Расположение ракет на МиГ-27 чуть отличается плюс другой пилон   
                    elif 'MiG-27' in self.parent.parent['unitName']:
                        weaponMesh1newObject1.localPosition = [-1.428,-1.57,-0.02]
                        weaponMesh1newObject1.applyRotation([-0.0175,0.0,0.0],True)
                        weaponMesh1newObject2.localPosition = [1.428,-1.57,0.02]
                        weaponMesh1newObject2.applyRotation([-0.0175,0.0,0.0],True)
                        pilon1 = scene.addObject('UniversalMesh', self)
                        pilon1.setParent(self, False, False)
                        pilon1['meshes'] = 'FLG_APU3W_'

Несколько длинновато, ну ладно, пускай на всякий случай будет.
Как видно из написанного, в обязательном порядке добавляется фигура летчика, а для МиГ-27 еще и пушка ГШ-630. Кроме того, с течением времени добавятся блоки выброса помех, контейнеры РЭБ, и другое вооружение, вроде никак не доделываемых мною УРВЗ Х-25.
Все это - одноразовая функция, исполняемая объектом Generator, с коротким временм жизни, двойной parent - это родитель его родителя (дедушка, сатло быть, хе-хе) - сам двигатель юнита. вот, значит, внучок, дедушку жизни учит... Проставляя ему свойства, прописанные в классе. Вся эта бюрократия, хотя и весьма объемна, но необходима. могу только сказать, что в том же WoE подобных перечислений на порядок больше. Хотя, может стоит брать все данные из текстовых файлов?  я просто не знаю, открытый, а потом закрытый текстовый файл загружает память или нет...
В общем, пока так обстоят дела. Картинок пока новых нет, так что остается только текст.
P.S. Сейчас видел забавное поведение вороны, прилетевшей на огород - попить ей, видите ли захотелось. Четыре ведра, одно закрытое. По очереди отпила из КАЖДОГО ОТКРЫТОГО. Видимо, думала, что в разных ведрах вода разной степени вкусности. Потом некоторое время поизучала закрытое и улетела. Видимо, решила, что там та же самая вода...

среда, 13 апреля 2016 г.

Горячая пора. Или опять "проклятые Блендером" меши.

Как-то незаметно подошло время подвешивать оружие. Пока не стреляющее. макеты, если угодно. Некоторое время пришлось потратить на то, чтобы уяснить алгоритм генерации оружия на подвесках и сами пилоны. Само оружие и пилоны, хотя и не имеют много поликов, но все же не плейны и тратить время на просчет невидимых с большого расстояния мелких объектов не хочется. Также не хотелось оставлять висящей мертвым грузом одноразовые кирпичи логики. Сначала было искушение сделать некий единый для всех генератор, но при импорте класса, насколько я понимаю, фокус с формированием имени импортируемого модуля не пройдет, во всяком случае, рисковать я не стал.
Я просто сделал объект с названием типа Generator_MiG-23BN_ в самом подгружаемом файле, поместив плейн на неактивный слой. Жить ему недолго - по окончании загрузки он удаляется. Но перед этим он добавляет и цепляет к своему родителю ("центру юнита", он же "бортовой номер")  плейн. Так называемый "универсальный меш" - и название у него такое же, только на инглиш. Заодно генератор добавляет мешу свойство weapon, если это оружие и общее для все таких объектов проперти meshes. В этом проперти указывается название меша, котороый должен проявиться при высоком уровне детализации. Заодно внес изменения в скрипт контроля состояния детализации юнита - с учетом нового имени UniversalMesh. После "подчистки" скрипта генерации от ошибок и опечаток был обруган консолью. Опять выползла та самая ошибка в мешах МиГ-23. Опять придется проводить лечение экспортом-импортом в формате obj. Вроде бы это последние 2осколки" от старого "зараженного" файла. Который, очевидно, за что-то был проклят Блендером и БГЕ.
Теперь у двигателя самолета присутствует лишь одно свойство для подвесок - pointWeapon, оно строковое и имеет вид типа: PTB-3_B-8_OFAB-250_FAB-100_. При помощи функции split('_')[индекс число]  происходит сортировка данных в проперти и мы получаем список вооружения для юнита. И вообще все подвесок. Первое значение зарезервировано  для топливных подвесных баков, далее идут уже названия подвесок вооружения на пилонах. Сами пилоны жестко прописаны в классе генерации, в самом подгружаемом бленде юнита, что исключает ошибки после отлаживания скрипта при его использовании, заодно освобождает от лишних проперти типа pilon.
Скорее всего, свойство pointWeapon я перенесу на сам генератор, а на движке самолета проперти уберу. Сам принцип пуска будет отличаться от ранее принятого. Не будет проперти pusk, команда на отсоединение и запуск нужного оружия будет будет подаваться прямо на нужный объект-потомок. Принцип формирования списков имеющегося оружия по значению класса weapon останется, этот метод себя вполне оправдал в первой версии. Информация об используемом оружии будет также передаваться на оверлейные сцены напрямую - непосредственно текстовому объекту - нет смысла держать в глобальном словаре "малоподвижные" элементы.
Заодно выяснилось, что сделанные мною зеркала не кушают много логики, если задать разрешение отрендериваемой видеотекстуре 128. Даже на 256 в принципе - терпимо - 25 процентов. При 128 - вообще 6 процентов. Так что пока зеркала в кабине оставлю в покое.
Остается дописать скрипт генерации и расстановки объектов, используя ранее написанные модули для самолетов в первой версии - это касается всех машин. Стартовые позиции и углы наклона для ракет и бомб уже давно прописаны, что сэкономит время.
В заключение - скрин МиГ-23БН с подвешенными блоками Б-8. Серый пилон подвески и стал той причиной, которая заставила ругаться консоль. Будем лечить...

четверг, 24 марта 2016 г.

От серматов к камуфляжу...

Что такое сермат я узнал относительно недавно. как оказалось, это всего лишь сокращение от слов "серый материал". Имеется в виду модель без текстур стандартного серого цвета. Именно с с созерцания такой модели пришлось начать работу по отработке уровней детализации.
Собственно, уровней детализации у меня сейчас  четыре. Малый уровень детализации - за пределами визуальной видимости (похоже, придется вводить еще одно проперти для юнитов - дистанцию визуальной видимости, потому как Б-52 и МиГ-21, к примеру, несопоставимы по размерам и первый виден гораздо дальше), на этом уровне, как таковая, отсутствует, есть только плейны-меши оружия и пилонов, ну и разумеется, сам параллелепипед юнита (движок). Низкий уровень детализации - присутствует схематично-грубый меш самолета, очень низкополигональный, без текстур(на больших расстояниях видны лишь черные и серые силуэты), затем средний - присутствует выскополигональная неанимрованная модель в виде единого меша. И только на дистанции меньше 200 метров появляется полностью анимированная и детализированная модель - это - высокий уровень детализации. Все это хитроумно расписано в коде... Было. Потому что все манипуляции с моделями идут через операцию replaceMesh.и вот тут опять начались проблемы.
Первым к использованию в игре был предназначен МиГ-23МФ. во-первых, для него была давно готова текстура, во-вторых, Миг-23 имеет крылог изменяемой стреловидности и есть возможность отработать вопрос с изменением свойств самолета сразу, чтобы потом к этому вопросу не возвращаться, в-третьих, когда я создавал эту модель, произошел какой-то сбой при дублировании мешей и они упорно не желали нормально подменяться. Для решения этой проблемы я просто экспортировал все меши в формат obj, а потом импортировал обратно в Блендер. Как выяснилось, надо было трясти не только меши крыльев, фюзеляжей, створок шасси, но и меши остекления и кокпита, которые были в отдельном файле. я же сдуру спокойно добавил и стекло и кокпит в создаваемый файл МиГ-23МФ и объединил их с мешами фюзеляжа и фонаря. Результат оказался "на лице": все прекрасно заменялось и работало, кроме фюзеляжа. Для проверки я полез в ранее созданный и временно отложенный за отсутствием текстур файл МиГ-23 БН. Там ни стекла, ни кокпитов не было, поэтому произошла замена мешей, как положено. Только результатом стала такая картинка:

Сермат, однако. И почему-то дырка в фюзеляже на месте заплатки створок шасси. Ладно, пересоздал файл МиГ-23МФ и снова получил ожидаемый сермат. Текстуры сразу накладывать не стал, решив проверить работу замены мешей. вторая картинка. И снова сермат:



И опять дыра в фюзеляже. Где заплатка?! Снова полез проверять принтом наличие искомой детали и ее видимость. Есть такая и видимость - Тrue. Не понял... А если это опять та застарелая ошибка? Вроде "заплатку2 я делал отдельно и не конвертил. Снова экспорт в obj и импорт обратно. Снова переименование объектов и добавление их в файлы (что характерно, ни БН, ни МФ мне до этого видимый меш заплатки не показали). И снова пуск игры. Так и есть. Видимо, тот дефектный меш снова о себе дал знать. Перед этим к модели я присоединил "леченые" стекла и "ванну" кокпита. И в итоге получил требуемую картинку. На сей раз в камуфляже.

Пока нет в кабине летчика, недоведена полетная модель и отсутствует анимация. Это еще предстоит сделать. Как и освоить агрегатирование, пример которогог denis8424 выложил в своем блоге. http://denis8424.blogspot.ru/2016/03/blog-post_22.html