среда, 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. Серый пилон подвески и стал той причиной, которая заставила ругаться консоль. Будем лечить...

5 комментариев:

  1. Что значит "фокус с формированием имени импортируемого модуля не пройдет"?

    ОтветитьУдалить
  2. importclassName = own['prop1'] + own['prop2']
    import importClassName

    Что-то я сомневаюсь насчет этого. В коде импорта модулей обычно просто:

    import ClassModule
    Где ClassModule - имя импортируемого модуля. Не пойму - является ли имя модуля строкой или нет. Не стал этим заниматься из-за спешки с остальными вещами, хотя проверить стоит. Но не слишком-то верится, что сработает...

    ОтветитьУдалить
  3. Проверил - такой способ не пройдет.

    ОтветитьУдалить
    Ответы
    1. Да ладно)))
      import sys
      sys.modules["новое_имя"] = obj
      import новое_имя

      так же под этим именем модуль будет доступен из логического блока python-модуль

      Удалить
    2. еще есть функция __import__ принимает первым параметром строку имя модуля

      Удалить