Model Config: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - " ( *class [a-zA-Z0-9_]+): +" to " $1 : ")
 
(88 intermediate revisions by 20 users not shown)
Line 1: Line 1:
===Description===
{{TOC|side}}
 
The model configuration file (model cfg for short) is the interface between a (P3D) model and the program.<br>
The model configuration file (model cfg for short) is the interface between a (P3D) model and the program.<br />
It is a look-up table which is processed during the binarization process, to tell the program what the various sections of the model are, which skeleton it uses and how it is animated.
It is a look-up table which is processed during the binarization process, to tell the program what the various sections of the model are, which skeleton it uses and how it is animated.


This system is more flexible than the one previously used, because all the information is stored for the model and not for the object class in the main configuration file. This means that several object classes can use the same model and don't have to define the animations for this model seperately.
This system is more flexible than the one previously used, because all the information is stored for the model and not for the object class in the main configuration file. This means that several object classes can use the same model and don't have to define the animations for this model separately.


A goal of the system is to seperate the configuration of models into a designer and an artist part.<br />
A goal of the system is to separate the configuration of models into a designer and an artist part.<br>
This is done by the introduction of a class [[#AnimationSources|AnimationSources]] in the main configuration file (the designer part) and the continuing use of the class <i>Animations</i> in the model cfg (the artist part).
This is done by the introduction of a class [[#AnimationSources|AnimationSources]] in the main configuration file (the designer part) and the continuing use of the class ''Animations'' in the model cfg (the artist part).


Most models will be able to inherit definitions from basic definitions on higher levels in the data hierarchy. An example hierarchy is described and illustrated below.
Most models will be able to inherit definitions from basic definitions on higher levels in the data hierarchy. An example hierarchy is described and illustrated below.


<i>p:\ofp2\vehicles\model.cfg</i> - Defines a class <i>Default</i>.<br />
* {{hl|p:\ofp2\vehicles\model.cfg}} - Defines a class {{hl|Default}}.
<i>p:\ofp2\vehicles\land\wheeled\model.cfg</i> - Defines a class <i>Car</i>.<br />
* {{hl|p:\ofp2\vehicles\land\wheeled\model.cfg}} - Defines a class {{hl|Car}}.
<i>p:\ofp2\vehicles\land\wheeled\landrover\model.cfg</i> - Defines a class <i>LandRover</i>.<br /><br />
* {{hl|p:\ofp2\vehicles\land\wheeled\landrover\model.cfg}} - Defines a class {{hl|LandRover}}.


<i>p:\ofp2\vehicles\land\wheeled\landrover\lr6x6_3</i> - In the model is a property <i>config=LandRover</i> (this feature is not implemented and may never be).<br />
* {{hl|p:\ofp2\vehicles\land\wheeled\landrover\lr6x6_3}} - In the model is a property {{hl|c= config = LandRover}} (this feature is not implemented and may never be).
<i>p:\ofp2\vehicles\land\wheeled\landrover\lr6x6_mg240</i> - Has a <i>LR6x6_MG240.cfg</i>, which inherits from class <i>LandRover</i> and adds definitions for a turret.
* {{hl|p:\ofp2\vehicles\land\wheeled\landrover\lr6x6_mg240}} - Has a {{hl|LR6x6_MG240.cfg}}, which inherits from class {{hl|LandRover}} and adds definitions for a turret.


[[File:ModelCfg1.jpg|Sample tree hierarchy]]


[[Image:ModelCfg1.jpg|Sample tree hierarchy]]
=== Notes ===


At this stage the file is parsed during the binarization of a model and animations can be played in the program with user actions.
Eventually they can be previewed using the Buldozer viewer.


===Notes===
The model cfg follows a set of naming conventions.
There can be several model cfg files, named by default {{hl|model.cfg}}, named after the folder name or named after a specific model.
In the case that both a {{hl|model.cfg}} and {{hl|&lt;foldername&gt;.cfg}} are present, only the latter is parsed.
The {{hl|&lt;modelname&gt;.cfg}} is parsed alongside of the other model cfg files and therefore the model can be seen as an additional level in the hierarchy.


At this stage the file is parsed during the binarization of a model and animations can be played in the program with user actions. Eventually they can be previewed using the Buldozer viewer.
When we have an example folder called {{hl|humr}} with a model called {{hl|hmmwv.p3d}}, we can use the following names: {{hl|model.cfg}} or {{hl|humr.cfg}} and next to that a {{hl|hmmwv.cfg}}.


The model cfg follows a set of naming conventions. There can be several model cfg files, named by default <i>model.cfg</i>, named after the folder name or named after a specific model. In the case that both a <i>model.cfg</i> and <i>&lt;foldername&gt;.cfg</i> are present, only the latter is parsed. The <i>&lt;modelname&gt;.cfg</i> is parsed alongside of the other model cfg files and therefore the model can be seen as an additional level in the hierarchy.
In the future a model may support a named property called {{hl|config}}, which tells the model which class in the model cfg to use.
There is some doubt whether this feature will be implemented though.


When we have an example folder called <i>humr</i> with a model called <i>hmmwv.p3d</i>, we can use the following names: <i>model.cfg</i> or <i>humr.cfg</i> and next to that a <i>hmmwv.cfg</i>.
There are model cfg files that do not relate directly to a specific model, but are used for the generic base class definitions, such as class {{hl|Default}}.


In the future a model may support a named property called <i>config</i>, which tells the model which class in the model cfg to use. There is some doubt whether this feature will be implemented though.
The functionality of the animations has been extended, allowing to do in scripting what was done before using RTM animations.
In addition, animation [[#Animation_sources|controllers]] were introduced, which allow for the control of different animations at the same time.
This opens up possibilities like having several turrets on a tank.
 
The model cfg and main configuration file (where classes {{hl|[[#cfgModels|cfgModels]]}}, {{hl|[[#cfgSkeletons|cfgSkeletons]]}} and {{hl|[[#Animations|Animations]]}} were previously defined) operate together to smooth the change from the old to the new system.
When a model cfg and the main configuration file both define the same model, the model cfg takes precedence.
 
=== Segments ===
 
==== cfgModels ====
This segment defines all properties of each model. The class names correspond to the model name.<br>
Here you define which sections the model has, which skeleton it uses and its animations.
<syntaxhighlight lang="cpp">
// Declare base classes
class CarAnimations
{
class IndicatorSpeed;
};
</syntaxhighlight>


There are model cfg files that do not relate directly to a specific model, but are used for the generic base class definitions, such as class <i>Default</i>.
<syntaxhighlight lang="cpp">
class CfgModels
The functionality of the animations has been extended, allowing to do in scripting what was done before using RTM animations.
{
In addition, animation [[#Animation_sources|controllers]] were introduced, which allow for the control of different animations at the same time. This opens up possibilities like having several turrets on a tank.
class Car; // Declare base class.


The model cfg and main configuration file (where classes <i>[[#cfgModels|cfgModels]]</i>, <i>[[#cfgSkeletons|cfgSkeletons]]</i> and <i>[[#Animations|Animations]]</i> were previously defined) operate together to smooth the change from the old to the new system. When a model cfg and the main configuration file both define the same model, the model cfg takes precedence.
class Vodnik : Car
{
sectionsInherit = "Car"; // Inherit all sections from class Car.
// Add new section.
sections[] =
{
"section1"
};
skeletonName = "Vodnik"; // Use the Vodnik skeleton.


class Animations : CarAnimations // Inherit from generic animations.
{
class IndicatorSpeed : IndicatorSpeed // Redefine the maximum value
{ // for the speed indicator.
maxValue = 40;
};
};
};
};
</syntaxhighlight>


===Segments===
==== cfgSkeletons ====
This segment defines the skeleton for the model and the bones that it uses.


<syntaxhighlight lang="cpp">
====cfgModels====
class CfgSkeletons
{
class Car; // Define base class.


This segment defines all properties of each model. The class names correspond to the model name.<br />
class Vodnik : Car
Here you define which sections the model has, which skeleton it uses and its animations.
{
{{codecomment|//Declare base classes}}
skeletonInherit = "Car"; // Inherit all bones from class Car.
class CarAnimations
skeletonBones[] = // Add two new bones. The movement of bone2 is linked to bone1.
{
{ // or in other words - bone2 is child of bone1 / bone 1 is parent of bone2
    class IndicatorSpeed;
// "<newbone>", "<parentbone>" // leave <parentbone> empty if it has no parents
};
"bone1", "",
"bone2", "bone1"
class CfgModels
};
{
pivotsModel = ""; // Location of pivot points (local axes) for hierarchical animation. (A2 only)
    class Car; {{codecomment|//Declare base class.}}
isDiscrete = 1; // 1 stands for discrete skinning values (0 or 100 % for each vertex of every selection)
// 0 stands for non-discrete (each vertex may have different skinning values for selections - animations have just partial effect on that vertex)
    class Vodnik: Car  
};
    {
};
      sectionsInherit = "Car"; {{codecomment|//Inherit all sections from class Car.}}
</syntaxhighlight>
                                {{codecomment|//Add new section.}}
      sections[] =
      {
          "section1"
      };
      skeletonName = "Vodnik"; {{codecomment|//Use the Vodnik skeleton.}}
      class Animations: CarAnimations {{codecomment|//Inherit from generic animations.}}
      {
          class IndicatorSpeed: IndicatorSpeed {{codecomment|//Redefine the maximum value}}
          {                                    {{codecomment|//for the speed indicator.}}
            maxValue = 40;
          };
      };
    };
};


==== Animations ====
This segment is part of class {{hl|[[#cfgModels|cfgModels]]}} and defines all animations used by the model.


====cfgSkeletons====
<syntaxhighlight lang="cpp">
class Animations
{
class FrontWheelR
{
type = "rotationX"; // The type of animation.
source = "wheel"; // The controller that provides input.
selection = "pravy predni"; // The name of the skeleton bone used.
axis = ""; // The name of the axis in the model.
memory = true; // Is the axis defined in the memory LOD of the model or not?
sourceAddress = "loop"; // Does the animation loop or not?


This segment defines the skeleton for the model and the bones that it uses.
minValue = 0; // The minimum value of the motion range.
// i.e. The controller input when animation phase is 0.


class CfgSkeletons
maxValue = 1; // The maximum value of the motion range.
{
// i.e. The controller input when animation phase is 1.
    class Car; {{codecomment|//Define base class.}}
    class Vodnik: Car
    {
      skeletonInherit = "Car"; {{codecomment|//Inherit all bones from class Car.}}
      skeletonBones[] =        {{codecomment|//Add two new bones. The movement}}
      {                        {{codecomment|//of bone2 is linked to bone1.}}
          "bone1", ""
          "bone2", "bone1"
      };
      pivotsModel = ""; {{codecomment|// Location of pivot points (local axes) for hierarchical animation. (A2 only)}}
    };
};


====Animations====
angle0 = 0; // The starting angle of this animation, where the
// animation phase is minValue
This segment is part of class <i>[[#cfgModels|cfgModels]]</i> and defines all animations used by the model.
class Animations
{
    class FrontWheelR
    {
      type = "rotationX"; {{codecomment|//The [[#Animation_types|type]] of animation.}}
      source = "wheel";  {{codecomment|//The [[#Animation_sources|controller]] that provides input.}}
      selection = "pravy predni"; {{codecomment|//The name of the skeleton bone used.}}
      axis = "";                  {{codecomment|//The name of the axis in the model.}}
      memory = true; {{codecomment|//Is the axis defined in the memory level of the}}
                      {{codecomment|//model or not?}}
      sourceAddress = "loop"; {{codecomment|//Does the animation loop or not?}}
      minValue = 0; {{codecomment|//The minimum value of the motion range.}}
                    {{codecomment|//i.e. The controller input when animation phase is 0.}}
      maxValue = 1; {{codecomment|//The maximum value of the motion range.}}
                    {{codecomment|//i.e. The controller input when animation phase is 1.}}
      angle0 = 0;   {{codecomment|//The starting angle of this animation, where the}}
                    {{codecomment|//animation phase is 0.}}
      angle1 = "rad -360"; {{codecomment|//The ending angle of this animation,}}
    };                      {{codecomment|//where the animation phase is 1.}}
};


angle1 = "rad -360"; // The ending angle of this animation,
}; // where the animation phase is maxValue
};
</syntaxhighlight>
See also [[#Animation_types|type]], [[#Animation_sources|controller]].


=====Animation sources=====
===== Animation sources =====
[[#source|source=]] is the controller that provides the data to the animation phase. It is declared in in cfgModels.ModelName.class Animations{...}. Inbuilt controllers are listed below. Custom controllers (source=user) can be constructed in config.cpp using cfgVehicles.ModelName.class AnimationSources{...} together with cfgVehicles.ModelName.class UserActions{...}
These are the controllers that provide the input for the animation phase of the animations. These controllers are defined in the animation class using the [[#source|source]] parameter. It's also possible to define custom controllers in the main configuration file, using class [[#Animation_sources|AnimationSources]].


''Controller names marked by * are freely defined by vehicle turret configs. The values here show the names commonly used for ArmA vehicles.''
''Controller names marked by * are freely defined by vehicle turret configs. The values here show the names commonly used for ArmA vehicles.''


{| border="1" align="center"
Arma 3 Update 1.60 comes with a new way how to handle multiple muzzle animation sources for weapons:
|-  
* The following may be used with indexes ranging from -1 to (number of muzzles - 1) in format "name.x" (e.g. reload.0):
! style="color: rgb(0, 0, 102);" | Name || style="color: rgb(0, 0, 102);" | Description || style="color: rgb(0, 0, 102);" | Simulation Classes
** revolving
|-
** ammo
| align="center" width=150px height=25|
** ammoRandom
| align="center" width=150px height=25|
** reload
| align="center" width=150px height=25|
** trigger
|-
** reloadMagazine
| align="center" width=150px|altBaro
** hasMagazine
| align="center" width=150px|The baro altitude.
** isEmptyNoReload
| align="center" width=150px|Aircraft
** isEmpty
|-  
** zeroing
| align="center" width=150px|altRadar
** weaponMode
| align="center" width=150px|The radar altitude.
* Index '''-1''' means currently selected muzzle, index 0 means first muzzle of given weapon, index 1 second and so on
| align="center" width=150px|Aircraft
* Animation sources without indexes should behave the same way as before.
|-  
 
| align="center" width=150px|gear
{| class="wikitable sortable"
| align="center" width=150px|The vehicle's gear.
|-
| align="center" width=150px|Aircraft
! Name !! Description !! Simulation Classes
|-  
|-
| align="center" width=150px|horizonBank
| altBaro
| align="center" width=150px|The banking angle of the vehicle.
| The baro altitude.
| align="center" width=150px|Aircraft
| Aircraft, Weapon
|-  
|-
| align="center" width=150px|horizonDive
| altRadar
| align="center" width=150px|The diving angle of the vehicle.
| The radar altitude.
| align="center" width=150px|Aircraft
| Aircraft
|-  
|-
| align="center" width=150px|vertSpeed
| altSurface(A3)
| align="center" width=150px|The vertical speed.
| Altitude above land surface (ignoring water). Usable for wavebreakers on amphibious vehicles or possibly water depth indicators for ships.
| align="center" width=150px|Aircraft
| CarX + ?
|-  
|-
| align="center" width=150px|aileron
| cyclicAside
| align="center" width=150px|The main aileron control surfaces.
| rotor mast machinery (or rotor) animations based on cyclic controls
| align="center" width=150px|Airplane
| Helicopter
|-  
|-
| align="center" width=150px|aileronB
| cyclicForward
| align="center" width=150px|The bottom speed brake as opening ailerons.
| rotor mast machinery (or rotor) animations based on cyclic controls
| align="center" width=150px|Airplane
| Helicopter
|-  
|-
| align="center" width=150px|aileronT
| gear
| align="center" width=150px|The top speed brake as opening ailerons.
| The vehicle's gear. 0 when Gear is down(outside), 1 when Gear is up(folded)
| align="center" width=150px|Airplane
| Aircraft
|-  
|-
| align="center" width=150px|aoa
| horizonBank
| align="center" width=150px|The Angle Of Attack.
| The banking angle of the vehicle.
| align="center" width=150px|Airplane
| Aircraft
|-  
|-
| align="center" width=150px|elevator
| horizonDive
| align="center" width=150px|The elevators.
| The diving angle of the vehicle.
| align="center" width=150px|Airplane
| Aircraft
|-  
|-
| align="center" width=150px|flap
| vertSpeed
| align="center" width=150px|The flaps.
| The vertical speed.
| align="center" width=150px|Airplane
| Aircraft
|-  
|-
| align="center" width=150px|rotor
| aileron
| align="center" width=150px|The rotors.
| The main aileron control surfaces.
| align="center" width=150px|Airplane
| Airplane
|-  
|-
| align="center" width=150px|rudder
| aileronB
| align="center" width=150px|The rudder.
| The bottom speed brake as opening ailerons.
| align="center" width=150px|Airplane
| Airplane
|-  
|-
| align="center" width=150px|speedBrake
| aileronT
| align="center" width=150px|The speed brake.
| The top speed brake as opening ailerons.
| align="center" width=150px|Airplane
| Airplane
|-  
|-
| align="center" width=150px|direction
| aoa
| align="center" width=150px|The orientation of the vehicle.
| The Angle Of Attack.
| align="center" width=150px|Any
| Airplane
|-  
|-
| align="center" width=150px|fuel
| elevator
| align="center" width=150px|The fuel level.
| The elevators. For missiles min & max values are calculated by reading maneuvrability attribute from cfgAmmo. Value is multiplied by +/-0.25
| align="center" width=150px|Any
| Airplane, Missiles
|-  
|-
| align="center" width=150px|oil
| flap
| align="center" width=150px|IndicatorOilTemp
| The flaps. 0 when disabled, 0.5 when half deployed, 1 when fully deployed
| align="center" width=150px|?
| Airplane
|-  
|-
| align="center" width=150px|gmeter
| rotor
| align="center" width=150px|The G-forces.
| The rotors.
| align="center" width=150px|Any
| Airplane
|-  
|-
| align="center" width=150px|rpm
| propeller
| align="center" width=150px|The rpm of the vehicle. Used in rpm indicators.
| Animation of propeller in water. Activates only when in water. Dependant on travel direction of vehicle and thrust or speed.
| align="center" width=150px|Any(except Ship)
| CarX, BoatX, TankX, + ?
|-  
|-
| align="center" width=150px|speed
| rudder
| align="center" width=150px|The speed of the vehicle. Used in speed indicators. (WARNING: maxValue should be in mps)
| The rudder controlls. For missiles min & max values are calculated by reading maneuvrability attribute from cfgAmmo. Value is multiplied by +/-0.25
| align="center" width=150px|Any
| Airplane, Missiles
|-  
|-
| align="center" width=150px|time
| speedBrake
| align="center" width=150px|Timer-based input.
| The speed brake.
| align="center" width=150px|Any
| Airplane
|-  
|-
| align="center" width=150px|<div id="clockHour">clockHour</div>
| thrustVector
| align="center" width=150px|The current time in hours.
| For animating VTOL elements (e.g. Osprey Tilt rotors). 0 when in horizontal flight, 1 when in hover mode.
| align="center" width=150px|Any (including e.g. Weapon)
| Airplane
|-  
|-
| align="center" width=150px|clockMinute
| direction
| align="center" width=150px|The current time in minutes. Derived from [[#clockHour|clockHour]].
| The orientation of the vehicle.
| align="center" width=150px|Any (including e.g. Weapon)
| Any
|-  
|-
| align="center" width=150px|clockSecond
| waypointDirection
| align="center" width=150px|The current time in seconds. Moves discreetly every second and independently from [[#clockHour|clockHour]].
| direction to waypoint
| align="center" width=150px|Any (including e.g. Weapon)
| Any
|-  
|-
| align="center" width=150px|damage
| fuel
| align="center" width=150px|Current damage level (0=healthy, 1=destroyed)
| The fuel level. 0 when tank is empty, 1 when tank is full
| align="center" width=150px|Any
| Any
|-
|-
| align="center" width=150px|user
| oil
| align="center" width=150px|User defined (script driven) animation
| IndicatorOilTemp [Does not work in A3]
| align="center" width=150px|Any
| ?
|-
|-
| align="center" width=150px|direct
| engineTemp
| align="center" width=150px|Like user, but immediate, no smooth transition.
| Temperature state of the vehicle engine [A3 post 1.66 only]
| align="center" width=150px|Any
| any ?
|-  
|-
| align="center" width=150px|pedals
| wheelsTemp
| align="center" width=150px|The pedals.
| Temperature state of the vehicles wheels [A3 post 1.66 only]
| align="center" width=150px|Bicycle
| any ?
|-
|-
| align="center" width=150px|damper
| turretGunTemp
| align="center" width=150px|The suspension of the vehicle. Currently only works with type [[#translationY|translationY]].
| Temperature state of the vehicles primary gun [A3 post 1.66 only]
| align="center" width=150px|Car, Tank, Aircraft, Motorcycle
| any ?
|-  
|-
| align="center" width=150px|FrontDamper
| exhaustIntensity
| align="center" width=150px|The suspension of the front wheels of the vehicle.
| ?
| align="center" width=150px|Car?
| Plane + ? (not tankX)
|-  
|-
| align="center" width=150px|BackDamper
| gmeter
| align="center" width=150px|The suspension of the back wheels of the vehicle.
| Total g-forces.
| align="center" width=150px|Car?
| Any
|-  
|-
| align="center" width=150px|drivingWheel
| gmeterx
| align="center" width=150px|The orientation of the steering wheel. Used for the steering wheel and steered wheels.
| g-force component in x direction.
| align="center" width=150px|Car, Ship, Motorcycle
| Any
|-  
|-
| align="center" width=150px|*mainGun
| gmetery
| align="center" width=150px|The main gun.
| g-force component in y direction.
| align="center" width=150px|Car, Tank, Helicopter, Ship
| Any
|-  
|-
| align="center" width=150px|*mainTurret
| gmeterz
| align="center" width=150px|The main turret.
| g-force component in z direction.
| align="center" width=150px|Car, Tank, Helicopter, Ship
| Any
|-  
|-
| align="center" width=150px|wheel
| rpm
| align="center" width=150px|Normal wheels that turn based on moving forward.
| The rpm of the vehicle. Used in rpm indicators.
| align="center" width=150px|Car, Airplane, Motorcycle
| Any(except Ship)
|-  
|-
| align="center" width=150px|noseWheelTurn
| speed
| align="center" width=150px|
| The speed of the vehicle. Used in speed indicators. (WARNING: 'maxValue' and 'minValue' should be in meters per second)
| align="center" width=150px|Airplane
| Any
|-  
|-
| align="center" width=150px|compassArrow
| time
| align="center" width=150px|The arrow.
| Timer-based input.
| align="center" width=150px|Compass
| Any
|-  
|-
| align="center" width=150px|compassCover
| timeRndOffset
| align="center" width=150px|The cover.
| Timer-based input + random offset (per object on spawn, offset constant)
| align="center" width=150px|Compass
| Any
|-  
|-
| align="center" width=150px|compassPointer
| objRandom
| align="center" width=150px|The pointer.
| random value per object on spawn, constant value
| align="center" width=150px|Compass
| Any
|-  
|-
| align="center" width=150px|rotorH
| <div id="clockHour">clockHour</div>
| align="center" width=150px|The 'horizontal' rotor.
| The current time in hours.
| align="center" width=150px|Helicopter
| Any (including e.g. Weapon)
|-  
|-
| align="center" width=150px|rotorV
| clockHour24
| align="center" width=150px|The 'vertical' rotor.
| The current time in hours in 24h scale.
| align="center" width=150px|Helicopter
| Any (including e.g. Weapon)
|-  
|-
| align="center" width=150px|rotorHDive
| clockMinute
| align="center" width=150px|Tilt of the 'horizontal' rotor.
| The current time in minutes. Derived from [[#clockHour|clockHour]].
| align="center" width=150px|Helicopter
| Any (including e.g. Weapon)
|-  
|-
| align="center" width=150px|rotorVDive
| clockSecond
| align="center" width=150px|Tilt of the 'vertical' rotor.
| The current time in seconds. Moves discreetly every second and independently from [[#clockHour|clockHour]].
| align="center" width=150px|Helicopter
| Any (including e.g. Weapon)
|-  
|-
| align="center" width=150px|support
| damage
| align="center" width=150px|The support stand.
| Current damage level (0=healthy, 1=destroyed)
| align="center" width=150px|Motorcycle
| Any
|-  
|-
| align="center" width=150px|*hatchCommander
| user
| align="center" width=150px|The commander hatch.
| User defined (script driven) animation
| align="center" width=150px|Tank
| Any
|-  
|-
| align="center" width=150px|hatchDriver
| userPositionHashedInit
| align="center" width=150px|The driver hatch.
| Randomized user defined (script driven) animation. This source is utilized on i.e. Tanoa gates and it is using initPhaseArray[] = {0.5, 0.75, 1}; to randomize initial state
| align="center" width=150px|Tank
| Any
|-  
|-
| align="center" width=150px|*hatchGunner
| direct
| align="center" width=150px|The gunner hatch.
| Like user, but immediate, no smooth transition.
| align="center" width=150px|Tank
| Any
|-  
|-
| align="center" width=150px|*obsGun
| pedals
| align="center" width=150px|The observer or commander gun.
| The pedals.
| align="center" width=150px|Tank
| Bicycle
|-  
|-
| align="center" width=150px|*obsTurret
| damper
| align="center" width=150px|The observer or commander turret.
| The suspension of the vehicle. Currently only works with type [[#translationY|translationY]].
| align="center" width=150px|Tank
| Car, Tank, Aircraft, Motorcycle
|-  
|-
| align="center" width=150px|reload
| FrontDamper
| align="center" width=150px|The movement when reloading.
| The suspension of the front wheels of the vehicle.
| align="center" width=150px|Weapon
| Car?
|-  
|-
| align="center" width=150px|revolving
| BackDamper
| align="center" width=150px|The movement when firing.
| The suspension of the back wheels of the vehicle.
| align="center" width=150px|Weapon
| Car?
|-  
|-
| align="center" width=150px|turretDir
| drivingWheel
| align="center" width=150px|The orientation of the turret.
| The orientation of the steering wheel. Used for the steering wheel and steered wheels.
| align="center" width=150px|Tank
| Car, Ship, Motorcycle, Tank
|-  
|-
| align="center" width=150px|wheelL
| *mainGun
| align="center" width=150px|The left track wheels.
| The main gun. *Alternatively defined with ''animationSourceGun'' in the turret config.
| align="center" width=150px|Tank
| Car, Tank, Helicopter, Ship
|-  
|-
| align="center" width=150px|wheelR
| *mainTurret
| align="center" width=150px|The right track wheels.
| The main turret. *Alternatively defined with ''animationSourceBody'' in turret config.
| align="center" width=150px|Tank
| Car, Tank, Helicopter, Ship
|-
|-
| align="center" width=150px|scudLauncher
| wheel
| align="center" width=150px|Phase of scudlaunch.
| Normal wheels that turn based on moving forward.
| align="center" width=150px|Scud
| Car, Airplane, Motorcycle
|-
|-
| align="center" width=150px|flag
| noseWheelTurn
| align="center" width=150px|Runs from 0 to 1 as flag is taken from flagpole.
|
| align="center" width=150px|Flagcarrier
| Airplane
|-
| compassArrow
| The arrow.
| Compass
|-
| compassCover
| The cover. No longer works in Arma 3 and always return 1.
| Compass
|-
| compassPointer
| The pointer.
| Compass
|-
| rotorH
| The 'horizontal' rotor.
| Helicopter
|-
| rotorV
| The 'vertical' rotor.
| Helicopter
|-
| rotorHDive
| Tilt of the 'horizontal' rotor.
| Helicopter
|-
| rotorVDive
| Tilt of the 'vertical' rotor.
| Helicopter
|-
| support
| The support stand.
| Motorcycle
|-
| *hatchCommander
| The commander hatch. *Alternatively defined with ''animationSourceHatch'' in the turret config.
| Tank
|-
| hatchDriver
| The driver hatch.
| Tank
|-
| *hatchGunner
| The gunner hatch. *Alternatively defined with ''animationSourceHatch'' in the turret config.
| Tank
|-
| *obsGun
| The observer or commander gun. *Alternatively defined with ''animationSourceGun'' in the turret config.
| Tank
|-
| *obsTurret
| The observer or commander turret. *Alternatively defined with ''animationSourceBody'' in the turret config.
| Tank
|-
| reload
| The movement when reloading. Source is 1 as soon as shot is fired and returns to 0 within in reload time.
| Weapon
|-
| revolving
| Source is 1.0 at full magazine and 0 at empty magazine. After each shot, the source will reduce by a fraction (1/magazincapacity) within the reloadTime from the weapon, i.e. a smooth transition.
| Weapon
|-
| isempty
| The animation to hold the bolt open when the weapon is empty.
| Weapon
|-
| turretDir
| The orientation of the turret.
| Tank
|-
| wheelL
| The left track wheels.
| Tank
|-
| wheelR
| The right track wheels.
| Tank
|-
| scudLauncher
| Phase of scudlaunch.
| Scud
|-
| flag
| Runs from 0 to 1 as flag is taken from flagpole.
| Flagcarrier
|-
| airspeedIndicatorRTD || speed / maxSpeed || RTD helicopter
|-
| altBaroRTD || altitude in meters || RTD helicopter
|-
| vertSpeedRTD || vertical speed / max speed || RTD helicopter
|-
| attitudeBankRTD || radians || RTD helicopter
|-
| attitudeDiveRTD || radians || RTD helicopter
|-
| skidRTD || speed / helicopter >> maxSpeed || RTD helicopter
|-
| altRadarRTD || altitude above ground in meters || RTD helicopter
|-
| rpm1RTD || engine 1 rmp / designed max rpm || RTD helicopter
|-
| rpm2RTD || engine 2 rmp / designed max rpm || RTD helicopter
|-
| rpm3RTD || engine 3 rmp / designed max rpm || RTD helicopter
|-
| temp1RTD || engine 1 temperature / helicopter >> DamagePropertiesRTD >> maxEngineTemperature || RTD helicopter (only TKOH)
|-
| temp2RTD || engine 2 temperature / helicopter >> DamagePropertiesRTD >> maxEngineTemperature || RTD helicopter (only TKOH)
|-
| temp3RTD || engine 3 temperature / helicopter >> DamagePropertiesRTD >> maxEngineTemperature || RTD helicopter (only TKOH)
|-
| torqueRTD || torque / helicopter >> DamagePropertiesRTD >> maxTorque || RTD helicopter
|-
| mainRotorRPMRTD || Main Rotor RPM / designed max RPM || RTD helicopter
|-
| tailRotorRPMRTD || Tail Rotor RPM / designed max RPM || RTD helicopter
|-
| collectiveRTD || collective (0, 1) || RTD helicopter
|-
| rudderRTD || Pedals (-1, 1) || RTD helicopter
|-
| throttleRTD1 || (0, 1) || RTD helicopter
|-
| throttleRTD2 || (0, 1) || RTD helicopter
|-
| throttleRTD3 || (0, 1) || RTD helicopter
|-
| torqueEng1RTD || (0, 1) || RTD helicopter
|-
| torqueEng2RTD || (0, 1) || RTD helicopter
|-
| torqueEng3RTD || (0, 1) || RTD helicopter
|-
| collective || collective (0, 1) || Helicopter
|-
|IsEmptyNoReload (A3) || 1 when empty and not reloading magazine || Weapon
|-
|reloadMagazine (A3) || Phase of magazine reload. For Handweapons 0 at the beginning and 1 at reloadTime. For Vehicle Weapons 1 at beginning, 0 after reloadTime. 0 When no reload happens. Only for first muzzle of weapon affects this. || Weapon
|-
|reloadMagazine2 (A3) || same as reloadMagazine. Used for second and all consequent muzzles. (obsolete with indexing) || Weapon
|-
|ammo (A3) || Number of remaining ammo in magazine (that means revolving * count). Transition is discrete, i.e. immediate switch from 45.0 to 44.0 for example. || Weapon
|-
|ammoRandom (A3) || Random value changing with every shoot fired from given magazine. || Weapon
|-
|zeroing1 (A3) || Current position in discreteDistance array for first muzzle. || Weapon
|-
|zeroing2 (A3) || Current position in discreteDistance array for second muzzle. || Weapon
|-
|hasOptics (A3) || Binary value of weapon having active optics in its TOP slot. || Weapon
|-
|hasAccessory (A3) || Binary value of weapon having active accessory in its SIDE slot. || Weapon
|-
|hasSuppressor (A3) || Binary value of weapon having active suppressor in its MUZZLE slot. || Weapon
|-
|hasUnderbarrel (A3) || Binary value of weapon having active bipod in its UNDERBARREL slot. || Weapon
|-
|hasMagazine (A3) || Binary value of weapon having active magazine. || Weapon
|-
|weaponMode (A3) || Current position in modes[] array of a weapon. Useful for fire selector switches etc. || Weapon
|-
|weaponMuzzle (A3) || Current position in muzzles[] array of a weapon. Useful for ladder sights that deploy when grenade launcher muzzle is selected. || Weapon
|-
|isSelected (A3) || Returns if the weapon is currently selected. Usefull for folding stocks and similar. || Weapon
|-
|primaryWeaponMode || untested || Weapon
|-
|primaryWeaponZeroing || untested || Weapon
|-
|Throttle (A3) || How much is the throttle used (0-1) || Transport
|-
|Brake (A3) || How much is the brake used (0-0.5) || Transport
|-
|maxHoldsterValue (A3) || holdsterAnimValue of currently selected weapon || Transport
|-
|*ObsElevation (A3) || Raise turret/Lower turret action. *Alternatively defined with ''animationSourceElevation'' in the turret config. || Transport
|-
|RotorHFullyDestroyed (A3) || 0 by default, 1 if the main rotor has been destroyed by impact || Helicopter
|-
|tailRotorHFullyDestroyed (A3) || 0 by default, 1 if the tail rotor has been destroyed by impact || Helicopter
|-
|bipod_legs (A3) || Binary value if bipod is deployed (1) or not (0) || Weapon attachment
|-
|bipod (A3) || Binary value if inbuilt bipod is deployed (1) or not (0) || Weapon
|-
|bipod_legs_length (A3) || Length of adjustable bipod legs (distance between bipod point and surface in meters) || Weapon attachment
|-
|bipod_length (A3) || Length of adjustable bipod legs (distance between bipod point and surface in meters) || Weapon
|-
|trigger (A3) || Actual animation phase of trigger finger animation || Weapon
|-
|collisionLights(A3) || Position lights || ?
|-
|MarkerLight|| used in AnimationSources class together with markerLight parameter i.e. (CollisionRed) linking to MarkerLights class. Source is 1 when light is on || Vehicle
|-
| pilotCameraRotX(A3)
| The turning (yawing) of [[A3_Targeting_config_reference#class_pilotCamera|pilotCamera]]
| Airplane, Helicopter
|-
| pilotCameraRotY(A3)
| The elevation (pitching) of [[A3_Targeting_config_reference#class_pilotCamera|pilotCamera]]
| Airplane, Helicopter
|-
| camElev(A3) || Camera elevation independent from main gun - used mainly on artillery with [[Turret_Config_Reference#elevationMode_.3D_3|elevationMode]] > 0. Affected by maxCamElev & minCamElev || Transport
|-
|vehicleTransporting || 0 when the vehicle is not transporting any vehicle, 1 when it is. || Vehicle
|-
|vehicleTransported || 0 when the vehicle is not being transported, 1 when the vehicle is being transported in another vehicle. || Vehicle
|-
|slingloading || 0 when the vehicle is not transporting any vehicle, 1 when it is. Progress between 0-1 should be gradual (same as in Sling Load Assistant) || Vehicle
|-
|slingloaded || 0 when the vehicle is not being sling loaded, 1 when the vehicle is being sling loaded by another vehicle. || Vehicle
|-
|thrusttime|| Goes from 0 after initTime is rached to thrustTiime value from cfgAmmo. || Missiles
|-
|initTime|| Goes from 0 to initTime value from cfgAmmo. I.e. if you have initTime = 0.15 in missile config, maxValue for this source will be 0.15 || Missiles
|-
|state|| Engine state: 0 - init, 1 - thrust, 2 - fly || Missiles
|-
|activeSensorsPhase|| Loop going from 0 to 1 (1 minute). Activated when radar is turned on || Vehicles
|-
|activeSensorsOn|| 1 when radar is activated || Vehicles
|-
|isPiP|| 1 when Picture in Picture is enabled in settings || Vehicles
|-
|drivingstickLeft|| 1 when thrustL (see EPEVehicle diagnostic view) is at 1|| Tank
|-
|drivingstickRight|| 1 when thrustR (see EPEVehicle diagnostic view) is at 1|| Tank
|-
|damageTracks|| Returns same value as tracks damage control in vehicle info GUI|| Tank
|-
|damageWheels|| Returns same value as wheels damage control in vehicle info GUI|| Car
|-
|inWater|| Returns 1 when vehicle is in water || Vehicles
|}
|}


=====Animation types=====
===== Animation types =====
This table outlines the Animation Types you can use for an animation class.
This table outlines the Animation Types you can use for an animation class.


{| class="wikitable sortable"
|-
! Type !! Description
|-
| rotation
| Circular motion.
|-
| rotationX
| Idem, but locked to the X axis.
|-
| rotationY
| Idem, but locked to the Y axis.
|-
| rotationZ
| Idem, but locked to the Z axis.
|-
| translation
| Motion along one axis.
|-
| translationX
| Idem, but locked to the X axis.
|-
| <div id="translationY">translationY</div>
| Idem, but locked to the Y axis.
|-
| translationZ
| Idem, but locked to the Z axis.
|-
| hide
| Hide once given threshold is reached
|-
| direct
| Rotation and/or translation (without using selection in model as axis)
|}
===== Animation Properties =====
This table outlines the properties (or entries) that each defined animation class expects to be present based on the animation type that is specified.


{| border="1" align="center"
Eg. If you specify a an animation type of 'rotationX' you must specify the animation properties 'angle0' and 'angle1'.
|-  
 
! style="color: rgb(0, 0, 102);" | Type || style="color: rgb(0, 0, 102);" | Description
{| class="wikitable sortable"
|-  
|-
| align="center" width=150px height=25|
! Property !! Description !! Animation Type
| align="center" width=150px height=25|
|-
|-  
| source
| align="center" width=150px|rotation
| Controller used for input.
| align="center" width=150px|Circular motion.
| Any
|-  
|-
| align="center" width=150px|rotationX
| selection
| align="center" width=150px|Idem, but locked to the X axis.
| Skeleton bone.
|-  
| Any
| align="center" width=150px|rotationY
|-
| align="center" width=150px|Idem, but locked to the Y axis.
| <div id="axis">axis</div>
|-  
| Model axis.
| align="center" width=150px|rotationZ
| Any
| align="center" width=150px|Idem, but locked to the Z axis.
|-
|-  
| <div id="begin">begin</div>
| align="center" width=150px|translation
| Starting point of an oriented model axis.<br>This can be used in combination with [[#end|end]] instead of [[#axis|axis]].
| align="center" width=150px|Motion along one axis.
| Any
|-  
|-
| align="center" width=150px|translationX
| <div id="end">end</div>
| align="center" width=150px|Idem, but locked to the X axis.
| Ending point of an oriented model axis.<br>This can be used in combination with [[#begin|begin]] instead of [[#axis|axis]].
|-  
| Any
| align="center" width=150px|<div id="translationY">translationY</div>
|-
| align="center" width=150px|Idem, but locked to the Y axis.
| memory
|-  
| Optional (default is true). Axis in memory level or not?
| align="center" width=150px|translationZ
| Any
| align="center" width=150px|Idem, but locked to the Z axis.
|-
|-  
| animPeriod
| align="center" width=150px|hide
| Time in seconds for one animation cycle.<br>Only used by ''user'' controllers.
| align="center" width=150px|Hide once given threshold is reached
| Any
|-  
|-
| align="center" width=150px|direct
| minValue
| align="center" width=150px|Rotation and/or translation (without using selection in model as axis)
| Minimum '''controller input'''. If [[animationPhase]] is below this minimum, it gets clamped / looped / mirrored (see [[#sourceAddress|sourceAddress]])
| Any
|-
| maxValue
| Maximum '''controller input'''. If [[animationPhase]] is above this maximum, it gets clamped / looped / mirrored (see [[#sourceAddress|sourceAddress]])
| Any
|-
| phaseBeg
| '''Controller input''' for which the motion begins. The motion gets clamped for inputs below this value.
| Any
|-
| phaseEnd
| '''Controller input''' for which the motion ends. The motion gets clamped for inputs above this value.
| Any
|-
| <div id="sourceAddress">sourceAddress</div>
| Does the animation loop or not? This can be any of three different values: clamp (default), loop or mirror.
| Any
|-
| angle0
| Starting angle of this animation, where the animation phase is 0.
| Rotations
|-
| angle1
| Ending angle of this animation, where the animation phase is 1.
| Rotations
|-
| offset0
| Starting offset of this animation, where the animation phase is 0.
| Translations
|-
| offset1
| Ending offset of this animation, where the animation phase is 1.
| Translations
|-
| hideValue
| Threshold for hiding ("hides selection once hidevalue is reached")
| Hide
|-
| unHideValue (A3 only)
| Threshold for unhiding (unhides it again after it was already hidden). Value Must be larger than hideValue
| Hide
|-
| axisPos[]
| Position of axis in model space
| Direct
|-
| axisDir[]
| Direction of axis (vector)
| Direct
|-
| angle
| Angle of rotation in degrees!
| Direct
|-
| axisOffset
| Used for translation
| Direct
|}
|}


=====Animation Properties=====
==== AnimationSources ====
This is '''not''' part of the model cfg, but part of the main configuration file.
This class allows you to define new user controllers or modify selected properties of existing controllers.
 
Defining custom controllers makes it possible to use one custom controller for several different animations.
If an animation does not define the [[#source|source]] parameter, the program looks for a custom controller defined in this class with the same name.
 
It is also possible to override an existing controller using this class, but be extremely careful in this case.
The custom controller will hide the original one, leaving the latter inaccessible.
Overriding is done using the ''::'' notation in the [[#source|source]] parameter as can be seen in the third example.


This table outlines the properties (or entries) that each defined animation class expects to be present based on the animation type that is specified.
<syntaxhighlight lang="cpp">
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.
};
};
</syntaxhighlight>
See also [[#Animation_sources|controller]], [[#reload|reload]].
 
<syntaxhighlight lang="cpp">
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.
};
};
</syntaxhighlight>
See also [[#source|source]].


Eg. If you specify a an animation type of 'rotationX' you must specify the animation properties 'angle0' and 'angle1'.
<syntaxhighlight lang="cpp">
class AnimationSources
{
class wheel
{
source = "::wheel"; // Overriding the existing wheel controller.
};
};
</syntaxhighlight>
See also [[#wheel|wheel]].


=== config.cpp model.cfg relationship ===


{| border="1" align="center"
Below is the class name relationship between the two for a user, (or modified), source. Poetic licence used
|-
! style="color: rgb(0, 0, 102);" | Property || style="color: rgb(0, 0, 102);" | Description || style="color: rgb(0, 0, 102);" | Animation Type
|-
| align="center" width=150px height=25|
| align="center" width=150px height=25|
| align="center" width=150px height=25|
|-
| align="center" width=150px|source
| align="center" width=150px|Controller used for input.
| align="center" width=150px|Any
|-
| align="center" width=150px|selection
| align="center" width=150px|Skeleton bone.
| align="center" width=150px|Any
|-
| align="center" width=150px|<div id="axis">axis</div>
| align="center" width=150px|Model axis.
| align="center" width=150px|Any
|-
| align="center" width=150px|<div id="begin">begin</div>
| align="center" width=150px|Starting point of an oriented model axis.<br />This can be used in combination with [[#end|end]] instead of [[#axis|axis]].
| align="center" width=150px|Any
|-
| align="center" width=150px|<div id="end">end</div>
| align="center" width=150px|Ending point of an oriented model axis.<br />This can be used in combination with [[#begin|begin]] instead of [[#axis|axis]].
| align="center" width=150px|Any
|-
| align="center" width=150px|memory
| align="center" width=150px|Optional (default is true). Axis in memory level or not?
| align="center" width=150px|Any
|-
| align="center" width=150px|animPeriod
| align="center" width=150px|Time in seconds for one animation cycle.<br />Only used by ''user'' controllers.
| align="center" width=150px|Any
|-
| align="center" width=150px|minValue
| align="center" width=150px|Minimum value of the motion range. i.e. Controller input when the animation phase is 0.
| align="center" width=150px|Any
|-
| align="center" width=150px|maxValue
| align="center" width=150px|Maxmimum value of the motion range. i.e. Controller input when the animation phase is 1.
| align="center" width=150px|Any
|-
| align="center" width=150px|minPhase
| align="center" width=150px|Minimum phase of the animation.i.e.<br />Animation phase when the controller value is 0.
| align="center" width=150px|Any
|-
| align="center" width=150px|maxPhase
| align="center" width=150px|Maxmimum value of the motion range.i.e.<br />Animation phase when the controller value is 1.
| align="center" width=150px|Any
|-
| align="center" width=150px|sourceAddress
| align="center" width=150px|Does the animation loop or not? This can be any of three different values: clamp (default), loop or mirror.
| align="center" width=150px|Any
|-
| align="center" width=150px|angle0
| align="center" width=150px|Starting angle of this animation, where the animation phase is 0.
| align="center" width=150px|Rotations
|-
| align="center" width=150px|angle1
| align="center" width=150px|Ending angle of this animation, where the animation phase is 1.
| align="center" width=150px|Rotations
|-
| align="center" width=150px|offset0
| align="center" width=150px|Starting offset of this animation, where the animation phase is 1.
| align="center" width=150px|Translations
|-
| align="center" width=150px|offset1
| align="center" width=150px|Ending offset of this animation, where the animation phase is 1.
| align="center" width=150px|Translations
|-
| align="center" width=150px|hideValue
| align="center" width=150px|Threshold for hiding
| align="center" width=150px|Hide
|-
| align="center" width=150px|axisPos[]
| align="center" width=150px|Position of axis in model space
| align="center" width=150px|Direct
|-
| align="center" width=150px|axisDir[]
| align="center" width=150px|Direction of axis (vector)
| align="center" width=150px|Direct
|-
| align="center" width=150px|angle
| align="center" width=150px|Angle of rotation in degrees!
| align="center" width=150px|Direct
|-
| align="center" width=150px|axisOffset
| align="center" width=150px|Used for translation
| align="center" width=150px|Direct
|}


====AnimationSources====
<syntaxhighlight lang="cpp">
class CfgModels
This is <b>not</b> part of the model cfg, but part of the main configuration file. This class allows you to define new user controllers or modify selected properties of existing controllers.
{
class NameOfP3d
Defining custom controllers makes it possible to use one custom controller for several different animations. If an animation does not define the [[#source|source]] parameter, the program looks for a custom controller defined in this class with the same name.
{
class Animations
It is also possible to override an existing controller using this class, but be extremely careful in this case. The custom controller will hide the original one, leaving the latter inaccessible. Overriding is done using the <i>::</i> notation in the [[#source|source]] parameter as can be seen in the third example.
{
class ModelClassName
{
selection = BoneName;
source = ModelClassName; // default  or, NameOfEngineAnimation ('wheel' eg), OR AnimClassName in config.cpp
};
};
};
};
</syntaxhighlight>


<syntaxhighlight lang="cpp">
class AnimationSources
class CfgVehicles
{
{
    class MachineGun
class ModelName
    {
{
      source = "reload"; {{codecomment|//The [[#Animation_sources|controller]] used for the definition of}}
class AnimationSources
                          {{codecomment|//this controller.}}
{
      weapon = MachineGun25W; {{codecomment|//In the specific case of using the [[#reload|reload]]}}
class AnimClassName
    };                         {{codecomment|//controller, the weapon class name.}}
{
};
AnimPeriod = 1; // mandatory. in seconds.
source = "user"; // optional. default = user
InitPhase = 1; // optional. default = 0
weapon = WeaponClassName; // only for source = reload;
};
};
class UserActions
{
class MeaninglessName
{
......
onlyforplayer = true/false; // mandatory
statement = "this animate ['AnimClassName', 1];"; // executed when action is triggered
};
};
};
};
</syntaxhighlight>


class AnimationSources
*most constructions avoid confusion: AnimClassName==ModelClassName==BoneName
{
*the word 'user' in both cfg and cpp appears to be, a) redundant, b) the default
    {{codecomment|//Used by animations called Door1, which don't define the [[#source|source]]}}
    {{codecomment|//parameter or by animations that define source &#61; Door1;.}}
    class Door1
    {
      source = "user"; {{codecomment|//The controller is defined as a user animation.}}
      animPeriod = 1;  {{codecomment|//The animation period used for this controller.}}
      initPhase=1;    {{codecomment|//Initial phase when object is created.}}
    };
};


class AnimationSources
=== See Also ===
{
    class wheel
    {
      source = "::wheel"; {{codecomment|//Overriding the existing [[#wheel|wheel]] controller.}}
    };
};


=== Example ===
* How-to for the CfgModels (a working attack helicopter): [[ArmA: Howto Model Config]]
* How-to on CfgModels & CfgSkeletons with additional description and examples: [[ArmA: How to animate a model]].


You can find a howto for the CfgModels (a working attack helicopter) [[ArmA:_Howto_Model_Config | here]] as well as a howto on cfgModels & cfgSkeletons with additional description and examples [[ArmA:_How_to_animate_a_model|here]].


[[Category:ArmA: Addon Configuration]]
{{GameCategory|arma1|Addon Configuration}}
[[Category:ArmA: Editing]]
{{GameCategory|arma1|Editing}}

Latest revision as of 12:04, 6 December 2023

The model configuration file (model cfg for short) is the interface between a (P3D) model and the program.
It is a look-up table which is processed during the binarization process, to tell the program what the various sections of the model are, which skeleton it uses and how it is animated.

This system is more flexible than the one previously used, because all the information is stored for the model and not for the object class in the main configuration file. This means that several object classes can use the same model and don't have to define the animations for this model separately.

A goal of the system is to separate the configuration of models into a designer and an artist part.
This is done by the introduction of a class AnimationSources in the main configuration file (the designer part) and the continuing use of the class Animations in the model cfg (the artist part).

Most models will be able to inherit definitions from basic definitions on higher levels in the data hierarchy. An example hierarchy is described and illustrated below.

  • p:\ofp2\vehicles\model.cfg - Defines a class Default.
  • p:\ofp2\vehicles\land\wheeled\model.cfg - Defines a class Car.
  • p:\ofp2\vehicles\land\wheeled\landrover\model.cfg - Defines a class LandRover.
  • p:\ofp2\vehicles\land\wheeled\landrover\lr6x6_3 - In the model is a property config = LandRover (this feature is not implemented and may never be).
  • p:\ofp2\vehicles\land\wheeled\landrover\lr6x6_mg240 - Has a LR6x6_MG240.cfg, which inherits from class LandRover and adds definitions for a turret.

Sample tree hierarchy

Notes

At this stage the file is parsed during the binarization of a model and animations can be played in the program with user actions. Eventually they can be previewed using the Buldozer viewer.

The model cfg follows a set of naming conventions. There can be several model cfg files, named by default model.cfg, named after the folder name or named after a specific model. In the case that both a model.cfg and <foldername>.cfg are present, only the latter is parsed. The <modelname>.cfg is parsed alongside of the other model cfg files and therefore the model can be seen as an additional level in the hierarchy.

When we have an example folder called humr with a model called hmmwv.p3d, we can use the following names: model.cfg or humr.cfg and next to that a hmmwv.cfg.

In the future a model may support a named property called config, which tells the model which class in the model cfg to use. There is some doubt whether this feature will be implemented though.

There are model cfg files that do not relate directly to a specific model, but are used for the generic base class definitions, such as class Default.

The functionality of the animations has been extended, allowing to do in scripting what was done before using RTM animations. In addition, animation controllers were introduced, which allow for the control of different animations at the same time. This opens up possibilities like having several turrets on a tank.

The model cfg and main configuration file (where classes cfgModels, cfgSkeletons and Animations were previously defined) operate together to smooth the change from the old to the new system. When a model cfg and the main configuration file both define the same model, the model cfg takes precedence.

Segments

cfgModels

This segment defines all properties of each model. The class names correspond to the model name.
Here you define which sections the model has, which skeleton it uses and its animations.

// Declare base classes
class CarAnimations
{
	class IndicatorSpeed;
};
class CfgModels
{
	class Car; // Declare base class.

	class Vodnik : Car
	{
		sectionsInherit = "Car"; // Inherit all sections from class Car.
		// Add new section.
		sections[] =
		{
			"section1"
		};
		skeletonName = "Vodnik"; // Use the Vodnik skeleton.

		class Animations : CarAnimations // Inherit from generic animations.
		{
			class IndicatorSpeed : IndicatorSpeed	// Redefine the maximum value
			{										// for the speed indicator.
				maxValue = 40;
			};
		};
	};
};

cfgSkeletons

This segment defines the skeleton for the model and the bones that it uses.

class CfgSkeletons
{
	class Car; // Define base class.

	class Vodnik : Car
	{
		skeletonInherit = "Car";			// Inherit all bones from class Car.
		skeletonBones[] =					// Add two new bones. The movement of bone2 is linked to bone1.
		{									// or in other words - bone2 is child of bone1 / bone 1 is parent of bone2
			// "<newbone>", "<parentbone>"	// leave <parentbone> empty if it has no parents
			"bone1", "",
			"bone2", "bone1"
		};
		pivotsModel = "";	// Location of pivot points (local axes) for hierarchical animation. (A2 only)
		isDiscrete = 1;		// 1 stands for discrete skinning values (0 or 100 % for each vertex of every selection)
							// 0 stands for non-discrete (each vertex may have different skinning values for selections - animations have just partial effect on that vertex)
	};
};

Animations

This segment is part of class cfgModels and defines all animations used by the model.

class Animations
{
	class FrontWheelR
	{
		type = "rotationX";			// The type of animation.
		source = "wheel";			// The controller that provides input.
		selection = "pravy predni";	// The name of the skeleton bone used.
		axis = "";					// The name of the axis in the model.
		memory = true;				// Is the axis defined in the memory LOD of the model or not?
		sourceAddress = "loop";		// Does the animation loop or not?

		minValue = 0;				// The minimum value of the motion range.
									// i.e. The controller input when animation phase is 0.

		maxValue = 1;				// The maximum value of the motion range.
									// i.e. The controller input when animation phase is 1.

		angle0 = 0;					// The starting angle of this animation, where the
									// animation phase is minValue

		angle1 = "rad -360";		// The ending angle of this animation,
	};								// where the animation phase is maxValue
};

See also type, controller.

Animation sources

source= is the controller that provides the data to the animation phase. It is declared in in cfgModels.ModelName.class Animations{...}. Inbuilt controllers are listed below. Custom controllers (source=user) can be constructed in config.cpp using cfgVehicles.ModelName.class AnimationSources{...} together with cfgVehicles.ModelName.class UserActions{...}

Controller names marked by * are freely defined by vehicle turret configs. The values here show the names commonly used for ArmA vehicles.

Arma 3 Update 1.60 comes with a new way how to handle multiple muzzle animation sources for weapons:

  • The following may be used with indexes ranging from -1 to (number of muzzles - 1) in format "name.x" (e.g. reload.0):
    • revolving
    • ammo
    • ammoRandom
    • reload
    • trigger
    • reloadMagazine
    • hasMagazine
    • isEmptyNoReload
    • isEmpty
    • zeroing
    • weaponMode
  • Index -1 means currently selected muzzle, index 0 means first muzzle of given weapon, index 1 second and so on
  • Animation sources without indexes should behave the same way as before.
Name Description Simulation Classes
altBaro The baro altitude. Aircraft, Weapon
altRadar The radar altitude. Aircraft
altSurface(A3) Altitude above land surface (ignoring water). Usable for wavebreakers on amphibious vehicles or possibly water depth indicators for ships. CarX + ?
cyclicAside rotor mast machinery (or rotor) animations based on cyclic controls Helicopter
cyclicForward rotor mast machinery (or rotor) animations based on cyclic controls Helicopter
gear The vehicle's gear. 0 when Gear is down(outside), 1 when Gear is up(folded) Aircraft
horizonBank The banking angle of the vehicle. Aircraft
horizonDive The diving angle of the vehicle. Aircraft
vertSpeed The vertical speed. Aircraft
aileron The main aileron control surfaces. Airplane
aileronB The bottom speed brake as opening ailerons. Airplane
aileronT The top speed brake as opening ailerons. Airplane
aoa The Angle Of Attack. Airplane
elevator The elevators. For missiles min & max values are calculated by reading maneuvrability attribute from cfgAmmo. Value is multiplied by +/-0.25 Airplane, Missiles
flap The flaps. 0 when disabled, 0.5 when half deployed, 1 when fully deployed Airplane
rotor The rotors. Airplane
propeller Animation of propeller in water. Activates only when in water. Dependant on travel direction of vehicle and thrust or speed. CarX, BoatX, TankX, + ?
rudder The rudder controlls. For missiles min & max values are calculated by reading maneuvrability attribute from cfgAmmo. Value is multiplied by +/-0.25 Airplane, Missiles
speedBrake The speed brake. Airplane
thrustVector For animating VTOL elements (e.g. Osprey Tilt rotors). 0 when in horizontal flight, 1 when in hover mode. Airplane
direction The orientation of the vehicle. Any
waypointDirection direction to waypoint Any
fuel The fuel level. 0 when tank is empty, 1 when tank is full Any
oil IndicatorOilTemp [Does not work in A3] ?
engineTemp Temperature state of the vehicle engine [A3 post 1.66 only] any ?
wheelsTemp Temperature state of the vehicles wheels [A3 post 1.66 only] any ?
turretGunTemp Temperature state of the vehicles primary gun [A3 post 1.66 only] any ?
exhaustIntensity ? Plane + ? (not tankX)
gmeter Total g-forces. Any
gmeterx g-force component in x direction. Any
gmetery g-force component in y direction. Any
gmeterz g-force component in z direction. Any
rpm The rpm of the vehicle. Used in rpm indicators. Any(except Ship)
speed The speed of the vehicle. Used in speed indicators. (WARNING: 'maxValue' and 'minValue' should be in meters per second) Any
time Timer-based input. Any
timeRndOffset Timer-based input + random offset (per object on spawn, offset constant) Any
objRandom random value per object on spawn, constant value Any
clockHour
The current time in hours. Any (including e.g. Weapon)
clockHour24 The current time in hours in 24h scale. Any (including e.g. Weapon)
clockMinute The current time in minutes. Derived from clockHour. Any (including e.g. Weapon)
clockSecond The current time in seconds. Moves discreetly every second and independently from clockHour. Any (including e.g. Weapon)
damage Current damage level (0=healthy, 1=destroyed) Any
user User defined (script driven) animation Any
userPositionHashedInit Randomized user defined (script driven) animation. This source is utilized on i.e. Tanoa gates and it is using initPhaseArray[] = {0.5, 0.75, 1}; to randomize initial state Any
direct Like user, but immediate, no smooth transition. Any
pedals The pedals. Bicycle
damper The suspension of the vehicle. Currently only works with type translationY. Car, Tank, Aircraft, Motorcycle
FrontDamper The suspension of the front wheels of the vehicle. Car?
BackDamper The suspension of the back wheels of the vehicle. Car?
drivingWheel The orientation of the steering wheel. Used for the steering wheel and steered wheels. Car, Ship, Motorcycle, Tank
*mainGun The main gun. *Alternatively defined with animationSourceGun in the turret config. Car, Tank, Helicopter, Ship
*mainTurret The main turret. *Alternatively defined with animationSourceBody in turret config. Car, Tank, Helicopter, Ship
wheel Normal wheels that turn based on moving forward. Car, Airplane, Motorcycle
noseWheelTurn Airplane
compassArrow The arrow. Compass
compassCover The cover. No longer works in Arma 3 and always return 1. Compass
compassPointer The pointer. Compass
rotorH The 'horizontal' rotor. Helicopter
rotorV The 'vertical' rotor. Helicopter
rotorHDive Tilt of the 'horizontal' rotor. Helicopter
rotorVDive Tilt of the 'vertical' rotor. Helicopter
support The support stand. Motorcycle
*hatchCommander The commander hatch. *Alternatively defined with animationSourceHatch in the turret config. Tank
hatchDriver The driver hatch. Tank
*hatchGunner The gunner hatch. *Alternatively defined with animationSourceHatch in the turret config. Tank
*obsGun The observer or commander gun. *Alternatively defined with animationSourceGun in the turret config. Tank
*obsTurret The observer or commander turret. *Alternatively defined with animationSourceBody in the turret config. Tank
reload The movement when reloading. Source is 1 as soon as shot is fired and returns to 0 within in reload time. Weapon
revolving Source is 1.0 at full magazine and 0 at empty magazine. After each shot, the source will reduce by a fraction (1/magazincapacity) within the reloadTime from the weapon, i.e. a smooth transition. Weapon
isempty The animation to hold the bolt open when the weapon is empty. Weapon
turretDir The orientation of the turret. Tank
wheelL The left track wheels. Tank
wheelR The right track wheels. Tank
scudLauncher Phase of scudlaunch. Scud
flag Runs from 0 to 1 as flag is taken from flagpole. Flagcarrier
airspeedIndicatorRTD speed / maxSpeed RTD helicopter
altBaroRTD altitude in meters RTD helicopter
vertSpeedRTD vertical speed / max speed RTD helicopter
attitudeBankRTD radians RTD helicopter
attitudeDiveRTD radians RTD helicopter
skidRTD speed / helicopter >> maxSpeed RTD helicopter
altRadarRTD altitude above ground in meters RTD helicopter
rpm1RTD engine 1 rmp / designed max rpm RTD helicopter
rpm2RTD engine 2 rmp / designed max rpm RTD helicopter
rpm3RTD engine 3 rmp / designed max rpm RTD helicopter
temp1RTD engine 1 temperature / helicopter >> DamagePropertiesRTD >> maxEngineTemperature RTD helicopter (only TKOH)
temp2RTD engine 2 temperature / helicopter >> DamagePropertiesRTD >> maxEngineTemperature RTD helicopter (only TKOH)
temp3RTD engine 3 temperature / helicopter >> DamagePropertiesRTD >> maxEngineTemperature RTD helicopter (only TKOH)
torqueRTD torque / helicopter >> DamagePropertiesRTD >> maxTorque RTD helicopter
mainRotorRPMRTD Main Rotor RPM / designed max RPM RTD helicopter
tailRotorRPMRTD Tail Rotor RPM / designed max RPM RTD helicopter
collectiveRTD collective (0, 1) RTD helicopter
rudderRTD Pedals (-1, 1) RTD helicopter
throttleRTD1 (0, 1) RTD helicopter
throttleRTD2 (0, 1) RTD helicopter
throttleRTD3 (0, 1) RTD helicopter
torqueEng1RTD (0, 1) RTD helicopter
torqueEng2RTD (0, 1) RTD helicopter
torqueEng3RTD (0, 1) RTD helicopter
collective collective (0, 1) Helicopter
IsEmptyNoReload (A3) 1 when empty and not reloading magazine Weapon
reloadMagazine (A3) Phase of magazine reload. For Handweapons 0 at the beginning and 1 at reloadTime. For Vehicle Weapons 1 at beginning, 0 after reloadTime. 0 When no reload happens. Only for first muzzle of weapon affects this. Weapon
reloadMagazine2 (A3) same as reloadMagazine. Used for second and all consequent muzzles. (obsolete with indexing) Weapon
ammo (A3) Number of remaining ammo in magazine (that means revolving * count). Transition is discrete, i.e. immediate switch from 45.0 to 44.0 for example. Weapon
ammoRandom (A3) Random value changing with every shoot fired from given magazine. Weapon
zeroing1 (A3) Current position in discreteDistance array for first muzzle. Weapon
zeroing2 (A3) Current position in discreteDistance array for second muzzle. Weapon
hasOptics (A3) Binary value of weapon having active optics in its TOP slot. Weapon
hasAccessory (A3) Binary value of weapon having active accessory in its SIDE slot. Weapon
hasSuppressor (A3) Binary value of weapon having active suppressor in its MUZZLE slot. Weapon
hasUnderbarrel (A3) Binary value of weapon having active bipod in its UNDERBARREL slot. Weapon
hasMagazine (A3) Binary value of weapon having active magazine. Weapon
weaponMode (A3) Current position in modes[] array of a weapon. Useful for fire selector switches etc. Weapon
weaponMuzzle (A3) Current position in muzzles[] array of a weapon. Useful for ladder sights that deploy when grenade launcher muzzle is selected. Weapon
isSelected (A3) Returns if the weapon is currently selected. Usefull for folding stocks and similar. Weapon
primaryWeaponMode untested Weapon
primaryWeaponZeroing untested Weapon
Throttle (A3) How much is the throttle used (0-1) Transport
Brake (A3) How much is the brake used (0-0.5) Transport
maxHoldsterValue (A3) holdsterAnimValue of currently selected weapon Transport
*ObsElevation (A3) Raise turret/Lower turret action. *Alternatively defined with animationSourceElevation in the turret config. Transport
RotorHFullyDestroyed (A3) 0 by default, 1 if the main rotor has been destroyed by impact Helicopter
tailRotorHFullyDestroyed (A3) 0 by default, 1 if the tail rotor has been destroyed by impact Helicopter
bipod_legs (A3) Binary value if bipod is deployed (1) or not (0) Weapon attachment
bipod (A3) Binary value if inbuilt bipod is deployed (1) or not (0) Weapon
bipod_legs_length (A3) Length of adjustable bipod legs (distance between bipod point and surface in meters) Weapon attachment
bipod_length (A3) Length of adjustable bipod legs (distance between bipod point and surface in meters) Weapon
trigger (A3) Actual animation phase of trigger finger animation Weapon
collisionLights(A3) Position lights ?
MarkerLight used in AnimationSources class together with markerLight parameter i.e. (CollisionRed) linking to MarkerLights class. Source is 1 when light is on Vehicle
pilotCameraRotX(A3) The turning (yawing) of pilotCamera Airplane, Helicopter
pilotCameraRotY(A3) The elevation (pitching) of pilotCamera Airplane, Helicopter
camElev(A3) Camera elevation independent from main gun - used mainly on artillery with elevationMode > 0. Affected by maxCamElev & minCamElev Transport
vehicleTransporting 0 when the vehicle is not transporting any vehicle, 1 when it is. Vehicle
vehicleTransported 0 when the vehicle is not being transported, 1 when the vehicle is being transported in another vehicle. Vehicle
slingloading 0 when the vehicle is not transporting any vehicle, 1 when it is. Progress between 0-1 should be gradual (same as in Sling Load Assistant) Vehicle
slingloaded 0 when the vehicle is not being sling loaded, 1 when the vehicle is being sling loaded by another vehicle. Vehicle
thrusttime Goes from 0 after initTime is rached to thrustTiime value from cfgAmmo. Missiles
initTime Goes from 0 to initTime value from cfgAmmo. I.e. if you have initTime = 0.15 in missile config, maxValue for this source will be 0.15 Missiles
state Engine state: 0 - init, 1 - thrust, 2 - fly Missiles
activeSensorsPhase Loop going from 0 to 1 (1 minute). Activated when radar is turned on Vehicles
activeSensorsOn 1 when radar is activated Vehicles
isPiP 1 when Picture in Picture is enabled in settings Vehicles
drivingstickLeft 1 when thrustL (see EPEVehicle diagnostic view) is at 1 Tank
drivingstickRight 1 when thrustR (see EPEVehicle diagnostic view) is at 1 Tank
damageTracks Returns same value as tracks damage control in vehicle info GUI Tank
damageWheels Returns same value as wheels damage control in vehicle info GUI Car
inWater Returns 1 when vehicle is in water Vehicles
Animation types

This table outlines the Animation Types you can use for an animation class.

Type Description
rotation Circular motion.
rotationX Idem, but locked to the X axis.
rotationY Idem, but locked to the Y axis.
rotationZ Idem, but locked to the Z axis.
translation Motion along one axis.
translationX Idem, but locked to the X axis.
translationY
Idem, but locked to the Y axis.
translationZ Idem, but locked to the Z axis.
hide Hide once given threshold is reached
direct Rotation and/or translation (without using selection in model as axis)
Animation Properties

This table outlines the properties (or entries) that each defined animation class expects to be present based on the animation type that is specified.

Eg. If you specify a an animation type of 'rotationX' you must specify the animation properties 'angle0' and 'angle1'.

Property Description Animation Type
source Controller used for input. Any
selection Skeleton bone. Any
axis
Model axis. Any
begin
Starting point of an oriented model axis.
This can be used in combination with end instead of axis.
Any
end
Ending point of an oriented model axis.
This can be used in combination with begin instead of axis.
Any
memory Optional (default is true). Axis in memory level or not? Any
animPeriod Time in seconds for one animation cycle.
Only used by user controllers.
Any
minValue Minimum controller input. If animationPhase is below this minimum, it gets clamped / looped / mirrored (see sourceAddress) Any
maxValue Maximum controller input. If animationPhase is above this maximum, it gets clamped / looped / mirrored (see sourceAddress) Any
phaseBeg Controller input for which the motion begins. The motion gets clamped for inputs below this value. Any
phaseEnd Controller input for which the motion ends. The motion gets clamped for inputs above this value. Any
sourceAddress
Does the animation loop or not? This can be any of three different values: clamp (default), loop or mirror. Any
angle0 Starting angle of this animation, where the animation phase is 0. Rotations
angle1 Ending angle of this animation, where the animation phase is 1. Rotations
offset0 Starting offset of this animation, where the animation phase is 0. Translations
offset1 Ending offset of this animation, where the animation phase is 1. Translations
hideValue Threshold for hiding ("hides selection once hidevalue is reached") Hide
unHideValue (A3 only) Threshold for unhiding (unhides it again after it was already hidden). Value Must be larger than hideValue Hide
axisPos[] Position of axis in model space Direct
axisDir[] Direction of axis (vector) Direct
angle Angle of rotation in degrees! Direct
axisOffset Used for translation Direct

AnimationSources

This is not part of the model cfg, but part of the main configuration file. This class allows you to define new user controllers or modify selected properties of existing controllers.

Defining custom controllers makes it possible to use one custom controller for several different animations. If an animation does not define the source parameter, the program looks for a custom controller defined in this class with the same name.

It is also possible to override an existing controller using this class, but be extremely careful in this case. The custom controller will hide the original one, leaving the latter inaccessible. Overriding is done using the :: notation in the source parameter as can be seen in the third example.

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.
	};
};

See also controller, reload.

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.
	};
};

See also source.

class AnimationSources
{
	class wheel
	{
		source = "::wheel"; // Overriding the existing wheel controller.
	};
};

See also wheel.

config.cpp model.cfg relationship

Below is the class name relationship between the two for a user, (or modified), source. Poetic licence used

class CfgModels
{
	class NameOfP3d
	{
		class Animations
		{
			class ModelClassName
			{
				selection = BoneName;
				source = ModelClassName;	// default  or, NameOfEngineAnimation ('wheel' eg), OR AnimClassName in config.cpp
			};
		};
	};
};
class CfgVehicles
{
	class ModelName
	{
		class AnimationSources
		{
			class AnimClassName
			{
				AnimPeriod = 1;				// mandatory. in seconds.
				source = "user";			// optional. default = user
				InitPhase = 1;				// optional. default = 0
				weapon = WeaponClassName;	// only for source = reload;
			};
		};
		class UserActions
		{
			class MeaninglessName
			{
				......
				onlyforplayer = true/false;							// mandatory
				statement = "this animate ['AnimClassName', 1];";	// executed when action is triggered
			};
		};
	};
};
  • most constructions avoid confusion: AnimClassName==ModelClassName==BoneName
  • the word 'user' in both cfg and cpp appears to be, a) redundant, b) the default

See Also