vitacite
|
Среда, 22.03.2017, 15:34
|
|
*Часть справочной информации взята из мануала PMC_modeling,
Файл model.cfg - является интерфейсом между моделью p3d и Arma3, он необходим если вы хотите проигрывать анимации для ваших объектов либо анимировать их целиком. Например открывающиеся двери, окна, бьющиеся стекла, вращающиеся вентиляторы или лопасти пропеллера, оружие, анимация техники и тд. и тп. Так же он необходим для динамической анимации, но в данном уроке это не рассматривается. Этот файл выполняет роль некой справочной таблицы, которая обрабатывается во время процесса бинаризации, чтобы сообщить программе, каковы различные секции модели, какие скелеты используются и как она анимируется. Данная система более гибкая, чем ранее использовавшаяся (в OPS), потому что вся информация хранится для модели, а не для класса объекта в основном файле конфигурации. Это означает, что несколько классов объектов могут использовать одну и ту же модель и не обязательно определять анимации для этой модели отдельно. В файл model.cfg вводится class AnimationSource он же вводится в файл основной конфигурации config.cfg таким образом происходит отделение динамической анимационной части от остальной модели. Большинство моделей смогут наследовать определения из базовых определений на более высоких уровнях в иерархии данных. После создания файла правильного model.cfg вы сможете просматривать анимации (статические) в buldozer за счет прокручивая их колесиком мышки, а динамические анимации прямо в object builder.
Ниже рассмотрим сегменты файла model.cfg Первый сегмент - CfgSkeleton - определение базовых классов, и "костей" вашего объекта.
Код class CfgSkeletons { class Default // определение базового класса { isDiscrete = 1; skeletonInherit = ""; skeletonBones[] = {}; };
class vwe_skel : Default // Может называться произвольно, но чтобы не путаться лучше называть как модель. { skeletonInherit="Default"; // указываем наследовать все подклассы класса Default; skeletonBones[]= // Задаем новые кости которые на 100% соответствуют названия в selection вашей модели как на примере ниже. { "door1","", // Дверь № 1 "door2","", // Дверь № 2 "door3","", // Дверь № 3 "door4","" // Дверь № 4 }; }; };
Второй сегмент: CfgModels: Этот сегмент определяет все свойства каждой модели. Названия классов соответствуют названию модели. Здесь вы определяете, какие разделы имеет модель, какой скелет использует и какие анимации будут в нее входить.
Код class CfgModels { class Default { sectionsInherit=""; определение базовых классов sections[] = {}; skeletonName = "Default"; }; Код class wrk_gaz3302 : Default { // название класса должно строго соответствовать названию модели skeletonName="vwe_skel"; // название скелетона который был вами установлен выше sectionsInherit=""; sections[]={"camo"}; class Animations { class door_01_rot { // название класса которое соответствует классу описанному в config.cfg source = "door_01_source"; type="rotation"; // выбранный Animation source selection="door1"; // название селекшена из модели axis="door1_axis"; // название оси вокруг которой открывается дверь memory=1; minValue=0.000000; // ниже параметры описывающие углы вращения и его степень maxValue=1.000000; angle0=0.000000; angle1=1; };
class door_02_rot { source = "door_02_source"; type="rotation"; selection="door2"; axis="door2_axis"; memory=1; minValue=0.000000; maxValue=1.000000; angle0=0.000000; angle1=-1; };
class door_03_rot { source = "door_03_source"; type="rotation"; selection="door3"; axis="door3_axis"; memory=1; minValue=0.000000; maxValue=1.000000; angle0=0.000000; angle1=-1.6; }; class door_04_rot { source = "door_04_source"; type="rotation"; selection="door4"; axis="door4_axis"; memory=1; minValue=0.000000; maxValue=1.000000; angle0=0.000000; angle1=-1.6; }; }; }; }; В таблице ниже описаны типы анимации, которые вы можете использовать для класса анимации:
и Animation property параметры которые могут быть применены к вашей анимации..
Animation source: является частью вашего основного файла конфигурации для модели config.cfg и связан параметрами с model.cfg
Надеюсь вы внимательно прочитали описанное выше.. Основными правилами для успешной анимации являются // 1. Наличие перфикса Land_ перед названием модели (в случае с примером врека грузовой газели) // описываемого тут это будет выглядеть, как:
Код class CfgPatches { class VWE_Terrain_structures_road_wreck { //Путь к папке с моделью requiredAddons[] = {VWE_Terrain_map_data}; //ссылка на аддон без которого ничего работать не будет requiredVersion = 0.1; // требуемая версия мода. units[] = { // перечисление всех моделей в конфиге 'Land_gaz3302_burn', //Любая модель с анимацией должна начинаться с перфикса (приставки Land_ 'Land_gaz3302_rust' }; weapons[] = {}; // 2. Обязательна так же отсылка к базовому классу House - без этого тоже ничего работать нормально не будет.
class CfgVehicles {
class HouseBase; // ссылки на базовые классы class House : HouseBase {}; class House_F : House{ class DestructionEffects; // External class reference }; class Land_gaz3302_burn: House_F { editorCategory = EdCat_VWE_Structures; //ссылка на название категориии в EDEN editorSubcategory = EdSubcat_VWE_Wreck; //ссылка на название подкатегории в EDEN _generalMacro = "Land_gaz3302_burn"; // ссылки для макросов model="\VWE\Terrain\Structures\Road_wreck\wrk_gaz3302.p3d"; //путь до модели displayName="Грузовая газель горелая"; // то что выводится на экран scope = public; // позволяет показывать модель в редакторе
// Выделите всю вашу модель в первом визуальном лоде и назовите ваш selection - "camo" ссылка на него в model.cfg и config.cfg позволить менять текстуры для ваших моделей. В данном примере для wreck-а грузовой Газели у меня на одну модель есть две текстуры - ржавая и горелая hiddenSelections[] = {"camo"}; hiddenSelectionsTextures[] = {"\VWE\Terrain\textures\auto_prop\qaz_3302_burnt_co.paa"}; // выбор текстуры для selection hiddenSelectionsMaterials[] = {"\VWE\Terrain\textures\auto_prop\qaz_3302_burnt.rvmat"}; //выбор материала для selection
class AnimationSources { // наконец-то добрались до анимации :)) class door_01_source { // в данном случае определяется пользовательский source source = "user"; initPhase = 0; //фаза инициализации animPeriod = 1; // время анимации sound = "RoadGateDoors"; // звук который проигрывается при открывании двери модели soundPosition = "door1_axis"; // звук будет исходить от оси указанная в model.cfg вокруг которой будет открываться дверь }; class door_02_source : door_01_source { // классы можно наследовать поэтому для второй двери и последующих дверей мы можем сослаться на первую и указать только различия в классах в данном случае источник звука soundPosition = "door2_axis"; }; ] class door_03_source : door_01_source { soundPosition = "door3_axis"; }; class door_04_source : door_01_source { soundPosition = "door4_axis"; }; }; class UserActions { // описание действий пользователя class OpenDoor_1 { displayNameDefault = "<img image='\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa' size='2.5' />"; // пиктограмма двери которая выводится на экран - указанная стандартная, можете заменять на свою. priority = 0.4; // Приоритет в акшен-меню играть в первую очередь. radius = 2; // Расстояние на котором будет срабатывать Action для армы все очень глючно и странно, выбирается исключительно опытным путем onlyForPlayer = false; // false - дверь могут открыть и боты и игрок, true - только игрок condition = "this animationPhase ""door_01_rot"" >= 0.5"; //описание анимации из model.cfg statement = "this animate [""door_01_rot"", 0];"; };
class CloseDoor_1: OpenDoor_1 { //используем тот же принцип наследования, ссылаемся на похожий объект и меняем только то, что различается displayName = "Открыть дверь водителя"; condition = "this animationPhase ""door_01_rot"" < 0.5"; statement = "this animate [""door_01_rot"", 1]; hintsilent 'door1 open';"; };
class OpenDoor_2: OpenDoor_1 { position = "opdoor_2"; displayName = "Закрыть дверь пассажира"; condition = "this animationPhase ""door_02_rot"" >= 0.5"; statement = "this animate [""door_02_rot"", 0]"; };
class CloseDoor_2: OpenDoor_2 { displayName = "Открыть дверь пассажира"; condition = "this animationPhase ""door_02_rot"" < 0.5"; statement = "this animate [""door_02_rot"", 1]"; }; class OpenDoor_3: OpenDoor_1 { displayName = "Закрыть створку №1"; position = "opdoor_3"; condition = "this animationPhase ""door_03_rot"" >= 0.5"; statement = "this animate [""door_03_rot"", 0]"; };
class CloseDoor_3: OpenDoor_3 { displayName = "Открыть створку №1"; condition = "this animationPhase ""door_03_rot"" < 0.5"; statement = "this animate [""door_03_rot"", 1]"; }; class OpenDoor_4: OpenDoor_1 { displayName = "Закрыть створку №2"; position = "opdoor_4"; condition = "this animationPhase ""door_04_rot"" >= 0.5"; statement = "this animate [""door_04_rot"", 0]"; };
class CloseDoor_4: OpenDoor_4 { displayName = "Открыть створку №2"; condition = "this animationPhase ""door_04_rot"" < 0.5"; statement = "this animate [""door_04_rot"", 1]"; }; };
// активируем Action описанные выше actionBegin1 = OpenDoor_1; actionEnd1 = OpenDoor_1; actionBegin2 = OpenDoor_2; actionEnd2 = OpenDoor_2; actionBegin3 = OpenDoor_3; actionEnd3 = OpenDoor_3; actionBegin4 = OpenDoor_4; actionEnd4 = OpenDoor_4;
// numberOfDoors = 4; }; // исходя из тех же принципов наследования для второй модели в данном случае ржавой газели используем // меняем только параметр camo и название, ведь все остальное уже описано выше class Land_gaz3302_rust: Land_gaz3302_burn { _generalMacro = "Land_gaz3302_rust"; displayName="Грузовая газель Ржавая"; hiddenSelectionsTextures[] = {"\VWE\Terrain\textures\auto_prop\qaz_3302_rust_co.paa"}; hiddenSelectionsMaterials[] = {"\VWE\Terrain\textures\auto_prop\qaz_3302_rust.rvmat"}; }; }; Контроллеры - которые могут быть определены в классе анимации с использованием параметра source описаны в таблице ниже
Ещё примеры:
Код class AnimationSources { class MachineGun { source = "reload"; //The controller used for the definition of //this controller weapon = MachineGun25W; //In the specific case of using the reload }; //controller, the weapon class name };
class AnimationSources { //Used by animations called Door1, which don't define the source //parameter or by animations that define source Door1; class Door1 { source = "user"; //The controller is defined as a user animation animPeriod = 1; //The animation period used for this controller initPhase=1; //Initial phase when object is created }; }; class AnimationSources { class wheel { source = "::wheel"; //Overriding the existing wheel controller }; };
|
|
Автор темы
|
|
|
|
|