()Официальным голосомЖ "Всех с наступающим Новым Годом, товарищи! Пусть Новый Год будет лучше прошедшего (для меня это болеее, чем актуально), но хуже идущего за ним 9это, наверное, актуально для всех)."
С поздравлениями закончили, переходим к делу. Только что, минут десять назад, подопытный кролик (а точнее, уже Очень Опытный Кролик) МиГ-23БН выпустил и убрал шасси. Кк положено, с характерным стоном гидравлики, открытием и закрытием створок, вращением и передвижением многочисленных деталей. На этом, похоже, эпопея с анимациями завершается. В очередной раз, надо заметить.
Постепенно проявилась схема работы скриптов, которая сменит предыдущую. Как я уже писал выше, теперь скрипты в подавляющем большинстве своем раскиданы по тематическим папкам, многие из них раздроблены для удобства на более мелкие модули, занимающиеся исключительно своим делом и не обращающие внимания на соседей.
Прежде чем я добил шасси, мне пришлось изрядно повозиться с анимацией крена. Анимацию тангажа я сделал с ходу, практически без проблем, как оно выглядит, смотрите в предыдущих постах, там должно быть про анимацию рыска yaw, то жесамое, только используются другие обозначения и и детали самолета. Не оставило особой проблемы справиться и с анимацией стабилизаторов при крене, даже с учетом хитрого механизма отклонения для МиГ-23. У этой машины при стреловидности до 72 половины стабилизаторов работают в режиме "ножницы" с углами отклонения плюс-минус десять градусов. А при максимальной стреловидности они отклоняются на угол шесть с половиной. Решилась эта проблема так...
#Наличие-отсутствие стабилизатора
def is_ROLL(self):
return True
def is_ROLL_Device(self):
ROLL_Device = [
["ElvL_",[-0.0087,0.0,0.0],"rotat",-1],
["ElvR_",[0.0087,0.0,0.0],"rotat",-1],
["ElvL_",[-0.0087,0.0,0.0],"rotat",1],
["ElvR_",[0.0087,0.0,0.0],"rotat",1]
]
return ROLL_Device
def is_POINT_ROLL(self):
reper = [-20, 20]
if self.WINGS > 300:
reper = [-13, 13]
#print(reper)
return reper
Этот код находится внутри класса-наследника самолета. Из него можно узнать имена деталей. скорость их отклонения за один тик, а также ограничения по отклонению. Первая функция говорит о том, есть ли такие детали в принципе. Втораяя перечисляет детали и их параметры, а вот третья... Как видно из кода, она способна выдать ограничения на угол отклонения. Это, на мой взгляд, проще, чем менять списки для деталей во второй функции. Да и скорость отклонения не меняется.
А вот далее пошла война с интерцепторами. Засада заключалась в том, что рабоать должен ТОЛЬКО один интерцептор, но НЕ ОБА ОДНОВРЕМЕННО. Для элеронов подобной проблемы нет. Они работают аналогично стабилизаторам - смотрим выше.
В общем, перпробовав уйму вариантов, я решение все-таки нашел. Пока один интерцептор не займет нулевое положение, второй работать не будет. Учитываются направление крена или его отсутствие...
if self.ROLLwings < 0 and self.rollSelf == -1:
ROLLwings_Device = [["InpL_",[0.0174,0.0,0.0],"rotat",-1]]
elif self.ROLLwings > 0 and self.rollSelf == 1:
ROLLwings_Device = [["InpR_",[-0.0174,0.0,0.0],"rotat",1]]
elif self.ROLLwings < 0 and self.rollSelf == 0:
ROLLwings_Device = [["InpL_",[0.0174,0.0,0.0],"rotat",1]]
elif self.ROLLwings > 0 and self.rollSelf == 0:
ROLLwings_Device = [["InpR_",[-0.0174,0.0,0.0],"rotat",-1]]
elif self.ROLLwings < 0 and self.rollSelf == 1:
ROLLwings_Device = [["InpL_",[0.0174,0.0,0.0],"rotat",1]]
elif self.ROLLwings > 0 and self.rollSelf == -1:
ROLLwings_Device = [["InpR_",[-0.0174,0.0,0.0],"rotat",-1]]
#print(self.ROLLwings,self.rotatY)
return ROLLwings_Device
def is_POINT_ROLLwings(self):
reper = [-45, 45]
if 299 < self.WINGS < 549:
reper = [-30, 30]
elif self.WINGS > 549:
reper = [0, 0]
#print(reper)
return reper
Из последней функции можно заметить отключение интерцепторов на максимальном угле стреловидности. Так и должно быть. Хотя можно и просто влепить выдачу False в первой функции. Может, так и сделаю...
Ладно, с анимацией все, переходим к шасси и лазейкам для ИИ.
import bge
#print("animat")
cont = bge.logic.getCurrentController()
own = cont.owner
#Импортируем модуль юнита
#unit_module = __import__(own.unitModule)
scene = bge.logic.getCurrentScene()
import sys
pathFolder = own.unitName + own.unitNation + "/folderPy"
sys.path.append(bge.logic.expandPath("//Aircraft/" + pathFolder))
unitmodule = own.unitNode + own.unitNation + "NodeScript"
unit_module = __import__(unitmodule)
def animat(own):
audioProp = "NULL"
########################
#Анимации механики юнита
#Перекладка крыла
if own.Temp_WINGS != own.WINGS:
wings(own)
#Шасси
if own.Temp_CHASSY != own.CHASSY:
#Звук
audioProp = "GEAR"
if own.Temp_CHASSY > own.CHASSY and own.CHASSY == 98:
audioGen(own, audioProp)
elif own.Temp_CHASSY < own.CHASSY and own.CHASSY == 2:
audioGen(own, audioProp)
unit_module.CHASSY(
Это часть кода из скрипта анимаций самолета. Он работает для всех машин. Изюминка здесь в том, что отыскивается и импортируется модуль с анимацией шасс по названию, указанному в атрибутах юнита. Смотрим строчки с sys.path и ниже. В импортированном модуле есть не только шасси, но есть и функция корректировки поведения самолета, КОНКРЕТНОГО самолета, в зависимости от разных условий. Смотрим код из этого "нодового" скрипта.
import bge
scene = bge.logic.getCurrentScene()
def correctData(own):
Airbrake = 0.35*own.AIRBRAKE/100
Chassy = 0.25*own.CHASSY/100
own.correctSpeed = 1.0 - Airbrake - Chassy
if own.Temp_WINGS != own.WINGS:
#Изменения в поведении самолета
changeWings(own)
#Сброс подкрыльевых ьаков, если они есть
if own.WINGS == 2:
sbrosPTB(own)
Ничего не мешает вставить и сюда в "шапку" импорт модуля искусственного интеллекта из этой же папки. Или более тонко смоделировать поведение КОНКРЕТНО этого типа самолета. Смоделировать что-то вроде национального характера пведения юнитов (есть такая поговорка - есть бойцы, есть военнослужащие, а есть арабы - наши советники на Ближнем Востоке навидались).
В общем, пока чистая бюрократия, картинок новых, извиняюсь, нет. Надеюсь, в Новом году будут.
Еще раз всех с Новым Годом!
С поздравлениями закончили, переходим к делу. Только что, минут десять назад, подопытный кролик (а точнее, уже Очень Опытный Кролик) МиГ-23БН выпустил и убрал шасси. Кк положено, с характерным стоном гидравлики, открытием и закрытием створок, вращением и передвижением многочисленных деталей. На этом, похоже, эпопея с анимациями завершается. В очередной раз, надо заметить.
Постепенно проявилась схема работы скриптов, которая сменит предыдущую. Как я уже писал выше, теперь скрипты в подавляющем большинстве своем раскиданы по тематическим папкам, многие из них раздроблены для удобства на более мелкие модули, занимающиеся исключительно своим делом и не обращающие внимания на соседей.
Прежде чем я добил шасси, мне пришлось изрядно повозиться с анимацией крена. Анимацию тангажа я сделал с ходу, практически без проблем, как оно выглядит, смотрите в предыдущих постах, там должно быть про анимацию рыска yaw, то жесамое, только используются другие обозначения и и детали самолета. Не оставило особой проблемы справиться и с анимацией стабилизаторов при крене, даже с учетом хитрого механизма отклонения для МиГ-23. У этой машины при стреловидности до 72 половины стабилизаторов работают в режиме "ножницы" с углами отклонения плюс-минус десять градусов. А при максимальной стреловидности они отклоняются на угол шесть с половиной. Решилась эта проблема так...
#Наличие-отсутствие стабилизатора
def is_ROLL(self):
return True
def is_ROLL_Device(self):
ROLL_Device = [
["ElvL_",[-0.0087,0.0,0.0],"rotat",-1],
["ElvR_",[0.0087,0.0,0.0],"rotat",-1],
["ElvL_",[-0.0087,0.0,0.0],"rotat",1],
["ElvR_",[0.0087,0.0,0.0],"rotat",1]
]
return ROLL_Device
def is_POINT_ROLL(self):
reper = [-20, 20]
if self.WINGS > 300:
reper = [-13, 13]
#print(reper)
return reper
Этот код находится внутри класса-наследника самолета. Из него можно узнать имена деталей. скорость их отклонения за один тик, а также ограничения по отклонению. Первая функция говорит о том, есть ли такие детали в принципе. Втораяя перечисляет детали и их параметры, а вот третья... Как видно из кода, она способна выдать ограничения на угол отклонения. Это, на мой взгляд, проще, чем менять списки для деталей во второй функции. Да и скорость отклонения не меняется.
А вот далее пошла война с интерцепторами. Засада заключалась в том, что рабоать должен ТОЛЬКО один интерцептор, но НЕ ОБА ОДНОВРЕМЕННО. Для элеронов подобной проблемы нет. Они работают аналогично стабилизаторам - смотрим выше.
В общем, перпробовав уйму вариантов, я решение все-таки нашел. Пока один интерцептор не займет нулевое положение, второй работать не будет. Учитываются направление крена или его отсутствие...
if self.ROLLwings < 0 and self.rollSelf == -1:
ROLLwings_Device = [["InpL_",[0.0174,0.0,0.0],"rotat",-1]]
elif self.ROLLwings > 0 and self.rollSelf == 1:
ROLLwings_Device = [["InpR_",[-0.0174,0.0,0.0],"rotat",1]]
elif self.ROLLwings < 0 and self.rollSelf == 0:
ROLLwings_Device = [["InpL_",[0.0174,0.0,0.0],"rotat",1]]
elif self.ROLLwings > 0 and self.rollSelf == 0:
ROLLwings_Device = [["InpR_",[-0.0174,0.0,0.0],"rotat",-1]]
elif self.ROLLwings < 0 and self.rollSelf == 1:
ROLLwings_Device = [["InpL_",[0.0174,0.0,0.0],"rotat",1]]
elif self.ROLLwings > 0 and self.rollSelf == -1:
ROLLwings_Device = [["InpR_",[-0.0174,0.0,0.0],"rotat",-1]]
#print(self.ROLLwings,self.rotatY)
return ROLLwings_Device
def is_POINT_ROLLwings(self):
reper = [-45, 45]
if 299 < self.WINGS < 549:
reper = [-30, 30]
elif self.WINGS > 549:
reper = [0, 0]
#print(reper)
return reper
Из последней функции можно заметить отключение интерцепторов на максимальном угле стреловидности. Так и должно быть. Хотя можно и просто влепить выдачу False в первой функции. Может, так и сделаю...
Ладно, с анимацией все, переходим к шасси и лазейкам для ИИ.
import bge
#print("animat")
cont = bge.logic.getCurrentController()
own = cont.owner
#Импортируем модуль юнита
#unit_module = __import__(own.unitModule)
scene = bge.logic.getCurrentScene()
import sys
pathFolder = own.unitName + own.unitNation + "/folderPy"
sys.path.append(bge.logic.expandPath("//Aircraft/" + pathFolder))
unitmodule = own.unitNode + own.unitNation + "NodeScript"
unit_module = __import__(unitmodule)
def animat(own):
audioProp = "NULL"
########################
#Анимации механики юнита
#Перекладка крыла
if own.Temp_WINGS != own.WINGS:
wings(own)
#Шасси
if own.Temp_CHASSY != own.CHASSY:
#Звук
audioProp = "GEAR"
if own.Temp_CHASSY > own.CHASSY and own.CHASSY == 98:
audioGen(own, audioProp)
elif own.Temp_CHASSY < own.CHASSY and own.CHASSY == 2:
audioGen(own, audioProp)
unit_module.CHASSY(
Это часть кода из скрипта анимаций самолета. Он работает для всех машин. Изюминка здесь в том, что отыскивается и импортируется модуль с анимацией шасс по названию, указанному в атрибутах юнита. Смотрим строчки с sys.path и ниже. В импортированном модуле есть не только шасси, но есть и функция корректировки поведения самолета, КОНКРЕТНОГО самолета, в зависимости от разных условий. Смотрим код из этого "нодового" скрипта.
import bge
scene = bge.logic.getCurrentScene()
def correctData(own):
Airbrake = 0.35*own.AIRBRAKE/100
Chassy = 0.25*own.CHASSY/100
own.correctSpeed = 1.0 - Airbrake - Chassy
if own.Temp_WINGS != own.WINGS:
#Изменения в поведении самолета
changeWings(own)
#Сброс подкрыльевых ьаков, если они есть
if own.WINGS == 2:
sbrosPTB(own)
Ничего не мешает вставить и сюда в "шапку" импорт модуля искусственного интеллекта из этой же папки. Или более тонко смоделировать поведение КОНКРЕТНО этого типа самолета. Смоделировать что-то вроде национального характера пведения юнитов (есть такая поговорка - есть бойцы, есть военнослужащие, а есть арабы - наши советники на Ближнем Востоке навидались).
В общем, пока чистая бюрократия, картинок новых, извиняюсь, нет. Надеюсь, в Новом году будут.
Еще раз всех с Новым Годом!
Комментариев нет:
Отправить комментарий