Страница 1 из 11
Форум » Мастерская » Разработка аддонов и карт » Моделирование » Статическая анимация объектов
Статическая анимация объектов
Среда, 22.03.2017, 15:34
1
Пользователь
*Часть справочной информации взята из мануала 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
                   };
};
Прикрепления: 4137425.png(168Kb) · 6296726.png(13Kb) · 0550093.png(30Kb) · 5815342.png(732Kb)

 
Форум » Мастерская » Разработка аддонов и карт » Моделирование » Статическая анимация объектов
Страница 1 из 11
Поиск:


Правила чата
Мини-чат
+Мини-чат
0