arma:howto_animate_model
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
arma:howto_animate_model [2007/07/04 11:54] – created howto_animate_model initial page snakeman | arma:howto_animate_model [2024/08/01 15:57] (current) – links added. snakeman | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== How to Animate | + | ====== |
- | SLX for their animation tutorials and examples. | + | [[https:// |
- | ====== Animations / translations ====== | + | **ArmA 1** aka Armed Assault (ArmA) |
- | after my own tests on the animations, i have discovered the following things: for the bones, it is possible to link several bones almost like in the article. | + | **Attention:** |
- | < | + | This article is a tutorial on how to animate parts of your model (e.g. wheels, rotors, etc.). Take all information of this article with a pinch of salt: everything is based on experiments and hasn't been confirmed nor documented by BIS, yet. |
+ | |||
+ | To animate a model, you have to make use of both, the // | ||
+ | |||
+ | The // | ||
+ | |||
+ | The // | ||
+ | |||
+ | **Model preparation: | ||
+ | |||
+ | Besides adding selections (same as in OFP but in ArmA bone selections should never overlap) you also need to add a following named property to your first resolution LOD (press **ALT-P** to open named properties window): | ||
+ | |||
+ | < | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | If your model has Geometry LOD the above needs to be also done for your Geometry LOD. This property stops engine from shifting the animation axes. | ||
+ | |||
+ | If you encounter a bug when your weapon bones fall apart after you drop it to the ground the reason might be lack of Geometry or View - pilot LODs. | ||
+ | |||
+ | ====== model.cfg ====== | ||
+ | |||
+ | According to the article about Model Config, the cfgSkeletons and cfgModels class should be part of a model.cfg file which is located in the addon pbo file. However, this does not seems to work (I assume the model.cfg files will be put into the model p3d file during binarization). For now, you can add the cfgSkeletons and cfgModels class to your config.cpp which works like a charm. | ||
+ | |||
+ | ====== CfgSkeletons ====== | ||
+ | |||
+ | The // | ||
+ | |||
+ | Each skeleton is a subclass within the cfgSkeletons class, consisting of three parameters: | ||
+ | |||
+ | ^ Parameter ^ Description ^ | ||
+ | | isDiscrete | currently unknown, set to 1 | | ||
+ | | skeletonInherit | inherit bones from given class | | ||
+ | | skeletonBones[] | define your own bones here | | ||
+ | |||
+ | ====== Defining a bone ====== | ||
+ | |||
+ | Bones are defined in the skeletonBones[] array which is made of a list of unsorted bones. Each bone is the name of a selection you want to animate. | ||
+ | |||
+ | ====== A single bone ====== | ||
+ | |||
+ | A bone is defined by using two strings: | ||
+ | |||
+ | <code cpp> | ||
+ | :" | ||
+ | </ | ||
+ | |||
+ | You may define multiple bones by stringing them together. | ||
+ | |||
+ | **Attention: | ||
+ | |||
+ | **Example** | ||
+ | |||
+ | <code cpp> | ||
skeletonBones[]= | skeletonBones[]= | ||
{ | { | ||
- | " | + | " |
- | " | + | " |
- | " | + | |
}; | }; | ||
</ | </ | ||
- | here, we have bone3 connected to bone2, which is connected to bone1. if bone1 move, bone2 and bone3 will move with him. if bone2 move, only bone3 will move with it, bone1 will remain unchanged, etc... i haven' | + | **Linked |
- | the translations. | + | The second argument (empty in the example above) is used for linking two bones: |
- | one thing important to know about translation axis(done several tests about it) | + | <code cpp> |
+ | :" | ||
+ | </ | ||
- | the distance between | + | Linking is used to make the animation of " |
- | this particular point might be useful if you have to scale up or scale down your whole model, if it is already animated, because the offset value may not need to change. | + | **Example** |
- | < | + | < |
- | class translatedobject | + | skeletonBones[]= |
+ | { | ||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | **Attention: | ||
+ | |||
+ | You can not link more than two bones in a row! If you do something like | ||
+ | |||
+ | <code cpp> | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | This will result in an error, as Armed Assault interprets this as: | ||
+ | * defining " | ||
+ | * defining " | ||
+ | |||
+ | However, it should be possible to use a syntax like this (not tested yet): | ||
+ | |||
+ | <code cpp> | ||
+ | skeletonBones[]= | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | In conclusion, " | ||
+ | |||
+ | **cfgSkeletons Example** | ||
+ | |||
+ | <code cpp> | ||
+ | class cfgSkeletons | ||
+ | { | ||
+ | class BWMod_Tiger_Skeleton | ||
+ | { | ||
+ | isDiscrete=1; | ||
+ | |||
+ | skeletonInherit=""; | ||
+ | skeletonBones[]= | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | ====== cfgModels ====== | ||
+ | |||
+ | The cfgModels class is used to declare the selections of a model you want to animate or access via the setObjectTexture command. Since ArmA, the cfgModels class has been extended an is now used to define all animations of a model. | ||
+ | |||
+ | Each of your model is a subclass inside of the cfgModels class and the models filename is used as the name of your class (without .p3d). E.g. your model p3d is named " | ||
+ | |||
+ | Each modelclass consists of three parameters and an additional subclass which defines the animations of your models: | ||
+ | |||
+ | ^ Parameter ^ Description ^ | ||
+ | | sectionsInherits | inherit sections (= selections) from given glass | | ||
+ | | sections[] | define your sections here | | ||
+ | | skeletonName | class name of skeleton used by this model | | ||
+ | | class Animations {} | subclass which defines the animations of your model | | ||
+ | |||
+ | **Sections** | ||
+ | |||
+ | A section is the same as a selection: a part of the model which may be animated or changed via the setObjectTexture command. To define selections in your modelclass make use of the section[]-array. This array is an unordered list of all selections you want to use in the ways described above. | ||
+ | |||
+ | **Example** | ||
+ | |||
+ | <code cpp> | ||
+ | sections[]= | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | **Animations** | ||
+ | |||
+ | To define animations for your model, you have to make use of the class animations in your modelclass. Each animation is a subclass in the class animations with a user definable name and consists of the following parameters: | ||
+ | |||
+ | ^ Parameter ^ Description ^ | ||
+ | | type | the type of the animation, e.g. rotating or translation. Refer to Model Config for a list of all animation types | | ||
+ | | source | The source used to animate the selection. Refer to Model Config for a list of all sources | | ||
+ | | selection | The name of the bone (= selection) you want to animate. Has to be defined in the cfgSkeletons class | | ||
+ | | axis | The name of the axis you want to use (only necessary for types // | ||
+ | | memory | If using an own axis (by the axis-parameter) use value 1 if axis is located in the memory lod of your model or 0 if the axis is located in the lod (or better: every lod) where your animated selection is used | | ||
+ | | sourceAdress | Use " | ||
+ | | minValue | If source returns a value <= minValue, the animation is animated with angle0 (see below) | | ||
+ | | maxValue | If source returns a value >= maxValue, the animation is animated with angle1 (see below) | | ||
+ | | angle0 | The angle the selection is animated when minValue is reached | | ||
+ | | angle1 | The angle the selection is animated when maxValue is reached | | ||
+ | | offset0 | The distance the bone is moved when using type=" | ||
+ | | offset1 | Same as offset0, but when maxValue is returned | | ||
+ | |||
+ | **Attention** | ||
+ | |||
+ | I am assuming that each source is returning a value between 0 and 1 (the // | ||
+ | * If using source=" | ||
+ | * If using source=" | ||
+ | |||
+ | //On turrets, it is necessary that the classnames of the animations match the according turret selection names.// | ||
+ | |||
+ | So if you're mainTurret selection is named " | ||
+ | |||
+ | **Example** | ||
+ | |||
+ | <code cpp> | ||
+ | class mainRotor | ||
{ | { | ||
- | type=" | + | type=" |
- | source=" | + | source=" |
- | selection=" | + | selection=" |
- | axis=" | + | axis=""; |
memory=1; | memory=1; | ||
- | sourceAddress=" | + | sourceAddress=" |
- | minValue="0"; | + | minValue=0; |
- | maxValue="1"; | + | maxValue=1; |
- | offset0="0"; | + | angle0=0; |
- | offset1="5"; | + | angle1="rad -360"; |
}; | }; | ||
</ | </ | ||
- | another important point to know, is that the types TranslationX, TranslationY, and TranslationZ, if used without | + | **Axes** |
+ | |||
+ | Since the axes seem a bit messed up when using // | ||
+ | |||
+ | Keep in mind that this image shows only the direction of these axes and //not// their position. The position is always defined by the center of your animated selection. | ||
+ | |||
+ | As a short example, the wheels would need " | ||
+ | |||
+ | {{https:// | ||
+ | |||
+ | **cfgModels example** | ||
+ | |||
+ | <code cpp> | ||
+ | class cfgModels | ||
+ | { | ||
+ | class bwmod_tiger | ||
+ | { | ||
+ | sectionsInherit=""; | ||
+ | sections[]= | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | }; | ||
+ | |||
+ | skeletonName=" | ||
+ | |||
+ | class Animations | ||
+ | { | ||
+ | class mainRotor | ||
+ | { | ||
+ | type=" | ||
+ | source=" | ||
+ | selection=" | ||
+ | axis=""; | ||
+ | memory=1; | ||
+ | sourceAddress=" | ||
+ | minValue=0; | ||
+ | maxValue=1; | ||
+ | angle0=0; | ||
+ | angle1=" | ||
+ | }; | ||
+ | |||
+ | class tailRotor | ||
+ | { | ||
+ | type=" | ||
+ | source=" | ||
+ | selection=" | ||
+ | axis=""; | ||
+ | memory=1; | ||
+ | sourceAddress=" | ||
+ | minValue=0; | ||
+ | maxValue=1; | ||
+ | angle0=0; | ||
+ | angle1=" | ||
+ | }; | ||
+ | |||
+ | class wheelL | ||
+ | { | ||
+ | type=" | ||
+ | source=" | ||
+ | // | ||
+ | //else. | ||
+ | selection=" | ||
+ | axis=" | ||
+ | memory=0; | ||
+ | animPeriod=0; | ||
+ | minValue=0; | ||
+ | maxValue=0.05; | ||
+ | offset0=0; | ||
+ | offset1=-0.05; | ||
+ | }; | ||
+ | |||
+ | class wheelR | ||
+ | { | ||
+ | type=" | ||
+ | source=" | ||
+ | selection=" | ||
+ | axis=" | ||
+ | memory=0; | ||
+ | animPeriod=0; | ||
+ | minValue=0; | ||
+ | maxValue=0.05; | ||
+ | offset0=0; | ||
+ | offset1=-0.05; | ||
+ | }; | ||
+ | |||
+ | class turret_RMK_x //the horizontal moving part of the turret | ||
+ | { | ||
+ | type=" | ||
+ | source=" | ||
+ | selection=" | ||
+ | axis=" | ||
+ | animPeriod=0; | ||
+ | memory=1; | ||
+ | minValue=" | ||
+ | maxValue=" | ||
+ | angle0=" | ||
+ | angle1=" | ||
+ | }; | ||
+ | |||
+ | class turret_RMK_y //the vertical moving part of the turret | ||
+ | { | ||
+ | type=" | ||
+ | source=" | ||
+ | selection=" | ||
+ | axis=" | ||
+ | animPeriod=0; | ||
+ | memory=1; | ||
+ | minValue=" | ||
+ | maxValue=" | ||
+ | angle0=" | ||
+ | angle1=" | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | ====== Machine Gun Belt Rotation ====== | ||
+ | |||
+ | Open your model in O2 and make a selection called " | ||
+ | |||
+ | Inside your model.cfg file open this class: | ||
+ | <code cpp> | ||
+ | class CfgSkeletons | ||
+ | { | ||
+ | class NameOfYourWeapon | ||
+ | { | ||
+ | isDiscrete = 0; | ||
+ | skeletonInherit = ""; | ||
+ | skeletonBones[] = | ||
+ | { | ||
+ | " | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | </ | ||
+ | Again in the model.cfg file, inside your CfgModels describe the new selection and animation as you see below. | ||
+ | <code cpp> | ||
+ | class CfgModels | ||
+ | { | ||
+ | class Default | ||
+ | { | ||
+ | sections[] = {}; | ||
+ | sectionsInherit = ""; | ||
+ | }; | ||
+ | |||
+ | class Weapon: default{}; | ||
+ | |||
+ | class NameOfYourWeapon | ||
+ | { | ||
+ | skeletonName = " | ||
+ | |||
+ | class Animations | ||
+ | { | ||
+ | |||
+ | class belt_rotation | ||
+ | { | ||
+ | type = " | ||
+ | source = " | ||
+ | selection = " | ||
+ | axis = " | ||
+ | minValue = 0; | ||
+ | maxValue = " | ||
+ | angle0 = " | ||
+ | angle1 = " | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | sections[] = { " | ||
+ | sectionsInherit = ""; | ||
+ | }; | ||
+ | }; | ||
+ | </ | ||
+ | To play around with the sliding belt you just need to take two values in consideration. | ||
+ | |||
+ | The first is the type = "" | ||
+ | |||
+ | " | ||
+ | |||
+ | One thing to take into consideration is the " | ||
+ | |||
+ | Now something worth noticing, let's say that you want the belt to move not straight but unbalanced, for that you will play with the angle0 = "" | ||
+ | |||
+ | |||
+ | ====== Animate Cargo Door ====== | ||
+ | |||
+ | In your model.cfg file in cfgModels put this for example: | ||
+ | <code cpp> | ||
+ | class Animations | ||
+ | { | ||
+ | class cargodoor | ||
+ | { | ||
+ | type = " | ||
+ | source = " | ||
+ | animPeriod = 2.5; | ||
+ | sourceAddress = " | ||
+ | selection = " | ||
+ | axis = " | ||
+ | memory = true; | ||
+ | minValue = 0; | ||
+ | maxValue = 1; | ||
+ | angle0 = 0; | ||
+ | angle1 = -0.488690; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | In config.cpp file in cfgVehicles put this: | ||
+ | <code cpp> | ||
+ | class AnimationSources: | ||
+ | { | ||
+ | class MoveX1 // Should be the same as your selection name. | ||
+ | { | ||
+ | source = " | ||
+ | animPeriod = 10; //The animation period used for this controller. | ||
+ | initPhase = 0; // | ||
+ | }; | ||
+ | }; | ||
+ | </ | ||
+ | And | ||
+ | <code cpp> | ||
+ | class UserActions | ||
+ | { | ||
+ | class CargoDoor_OpenP | ||
+ | { | ||
+ | displayName = "Open cargodoor"; | ||
+ | position = " | ||
+ | onlyforplayer = false; | ||
+ | radius = 0.5; | ||
+ | condition = "this animationPhase "" | ||
+ | statement = "this animate ["" | ||
+ | }; | ||
+ | </ |
arma/howto_animate_model.1183550047.txt.gz · Last modified: 2007/07/10 09:52 (external edit)