From Bohemia Interactive Community
Jump to navigation Jump to search

This page explains how to make an animation for Arma 3 using Blender.


  • Blender
  • Basic knowledge of Blender or similar modeling tools
  • Basic knowledge of configs and how they work
  • A text editor, such as Notepad++ or Visual Studio Code



A version compatible with Arma Toolbox (see below) should be used. As of writing this article, the latest version of Blender (v3.0) is compatible with the latest version of Arma Toolbox.

Arma Toolbox for Blender

Download the latest version of Alwarren's Arma Toolbox for Blender. If the master branch is noticeably newer than the latest release, download the contents of the master branch, and zip the ArmaToolbox folder.
Next, go to Blender -> Preferences -> Add-Ons -> Install, and provide the path to the zip file to install Arma Toolbox.

Character rig

For simplicity, Mascer's ArmaRig for Blender will be used in this tutorial.


A model.cfg file specifies the skeleton properties of the model.
The following example config can be used for Arma 2/3 characters.

class CfgSkeletons
	class Default
		isDiscrete = 1;
		skeletonInherit = "";
		skeletonBones[] = {};

	// The skeleton name. This will later be referenced in config.cpp file for the animation.
	class OFP2_ManSkeleton
		isDiscrete = 0;
		skeletonInherit = "";
		skeletonBones[] =
		// pairs of boneName, parentBone
			"Pelvis", "",
			"Spine", "Pelvis",
			"Spine1", "Spine",
			"Spine2", "Spine1",
			"Spine3", "Spine2",
			"Camera", "Pelvis",
			"weapon", "Spine1",
			"launcher", "Spine1",

			// Head skeleton in hierarchy
			"neck", "Spine3",
			"neck1", "neck",
			"head", "neck1",

			// New facial features
			"Face_Hub", "head",
			"Face_Jawbone", "Face_Hub",
			"Face_Jowl", "Face_Jawbone",
			"Face_chopRight", "Face_Jawbone",
			"Face_chopLeft", "Face_Jawbone",
			"Face_LipLowerMiddle", "Face_Jawbone",
			"Face_LipLowerLeft", "Face_Jawbone",
			"Face_LipLowerRight", "Face_Jawbone",
			"Face_Chin", "Face_Jawbone",
			"Face_Tongue", "Face_Jawbone",
			"Face_CornerRight", "Face_Hub",
			"Face_CheekSideRight", "Face_CornerRight",
			"Face_CornerLeft", "Face_Hub",
			"Face_CheekSideLeft", "Face_CornerLeft",
			"Face_CheekFrontRight", "Face_Hub",
			"Face_CheekFrontLeft", "Face_Hub",
			"Face_CheekUpperRight", "Face_Hub",
			"Face_CheekUpperLeft", "Face_Hub",
			"Face_LipUpperMiddle", "Face_Hub",
			"Face_LipUpperRight", "Face_Hub",
			"Face_LipUpperLeft", "Face_Hub",
			"Face_NostrilRight", "Face_Hub",
			"Face_NostrilLeft", "Face_Hub",
			"Face_Forehead", "Face_Hub",
			"Face_BrowFrontRight", "Face_Forehead",
			"Face_BrowFrontLeft", "Face_Forehead",
			"Face_BrowMiddle", "Face_Forehead",
			"Face_BrowSideRight", "Face_Forehead",
			"Face_BrowSideLeft", "Face_Forehead",
			"Face_Eyelids", "Face_Hub",
			"Face_EyelidUpperRight", "Face_Hub",
			"Face_EyelidUpperLeft", "Face_Hub",
			"Face_EyelidLowerRight", "Face_Hub",
			"Face_EyelidLowerLeft", "Face_Hub",
			"EyeLeft", "Face_Hub",
			"EyeRight", "Face_Hub",

			// Left upper side
			"LeftShoulder", "Spine3",
			"LeftArm", "LeftShoulder",
			"LeftArmRoll", "LeftArm",
			"LeftForeArm", "LeftArmRoll",
			"LeftForeArmRoll", "LeftForeArm",
			"LeftHand", "LeftForeArmRoll",
			"LeftHandRing", "LeftHand",
			"LeftHandRing1", "LeftHandRing",
			"LeftHandRing2", "LeftHandRing1",
			"LeftHandRing3", "LeftHandRing2",
			"LeftHandPinky1", "LeftHandRing",
			"LeftHandPinky2", "LeftHandPinky1",
			"LeftHandPinky3", "LeftHandPinky2",
			"LeftHandMiddle1", "LeftHand",
			"LeftHandMiddle2", "LeftHandMiddle1",
			"LeftHandMiddle3", "LeftHandMiddle2",
			"LeftHandIndex1", "LeftHand",
			"LeftHandIndex2", "LeftHandIndex1",
			"LeftHandIndex3", "LeftHandIndex2",
			"LeftHandThumb1", "LeftHand",
			"LeftHandThumb2", "LeftHandThumb1",
			"LeftHandThumb3", "LeftHandThumb2",

			// Right upper side
			"RightShoulder", "Spine3",
			"RightArm", "RightShoulder",
			"RightArmRoll", "RightArm",
			"RightForeArm", "RightArmRoll",
			"RightForeArmRoll", "RightForeArm",
			"RightHand", "RightForeArmRoll",
			"RightHandRing", "RightHand",
			"RightHandRing1", "RightHandRing",
			"RightHandRing2", "RightHandRing1",
			"RightHandRing3", "RightHandRing2",
			"RightHandPinky1", "RightHandRing",
			"RightHandPinky2", "RightHandPinky1",
			"RightHandPinky3", "RightHandPinky2",
			"RightHandMiddle1", "RightHand",
			"RightHandMiddle2", "RightHandMiddle1",
			"RightHandMiddle3", "RightHandMiddle2",
			"RightHandIndex1", "RightHand",
			"RightHandIndex2", "RightHandIndex1",
			"RightHandIndex3", "RightHandIndex2",
			"RightHandThumb1", "RightHand",
			"RightHandThumb2", "RightHandThumb1",
			"RightHandThumb3", "RightHandThumb2",

			// Left lower side
			"LeftUpLeg", "Pelvis",
			"LeftUpLegRoll", "LeftUpLeg",
			"LeftLeg", "LeftUpLegRoll",
			"LeftLegRoll", "LeftLeg",
			"LeftFoot", "LeftLegRoll",
			"LeftToeBase", "LeftFoot",

			// Right lower side
			"RightUpLeg", "Pelvis",
			"RightUpLegRoll", "RightUpLeg",
			"RightLeg", "RightUpLegRoll",
			"RightLegRoll", "RightLeg",
			"RightFoot", "RightLegRoll",
			"RightToeBase", "RightFoot"

		// location of pivot points (local axes) for hierarchical animation

class CfgModels
	class Default
		sectionsInherit = "";
		sections[] = {};
		skeletonName = "";

	class ArmaMan: Default
		htMin = 60;			// Minimum half-cooling time (in seconds)
		htMax = 1800;		// Maximum half-cooling time (in seconds)
		afMax = 30;			// Maximum temperature in case the model is alive (in celsius)
		mfMax = 0;			// Maximum temperature when the model is moving (in celsius)
		mFact = 1;			// Metabolism factor - number from interval <0, 1> (0 - metabolism has no influence, 1 - metabolism has full influence (no other temperature source will be considered)).
		tBody = 37;			// Metabolism temperature of the model (in celsius)

		sections[] =
			"osobnost", "Head_Injury", "Body_Injury", "l_leg_injury", "l_arm_injury", "r_arm_injury", "r_leg_injury", "injury_body", "injury_legs", "injury_hands",
			"clan", "clan_sign", "Camo", "CamoB", "Camo1", "Camo2", "personality", "hl", "injury_head", "insignia", "ghillie_hide"

		skeletonName = "OFP2_ManSkeleton";
↑ Back to spoiler's top


To properly binarize the .rtm file, pboProject from Mikero's Tools is recommended. The free version is sufficient for this tutorial.