Rtm (Animation) File Format
Animations
To help understand the contents of the file format, a brief idea of what animations are, is in order. An animation takes a collection of p3d files (picture-3d files) and displays them all-at-once as a 'frame'.
Any given p3d consists of say, a head, an arm, a leg, a foot. Together, they make up the the total view, the 'frame'. Each of these pictures which make up the frame, contain information on how to display that picture. Eg, it's orientation. As such, the specific p3d and the specific information about that p3d is termed a component.
Components, make up a frame.
Each frame (a collection of pictures, a collection of 'components') also contains a single value of how long to display that frame until moving to the next frame (if any). ALL frames contain the exact same pictures but with differing orientations.
And so:
Conventions
byte = 1 char = 8 bits ulong = unsigned long, 4 bytes ushort= unsigned short 2 bytes asciiz= variable length zero terminated string. float= 4byte (single precision)
XYZTriplet
XYZTriplet { float X,Y,Z; };
RtmFile
RtmFile { byte Signature[8]; // "RTM_0101" note. This is not asciiz XYZTriplet Vertex; // Total Moving XZY at 0,0,0 'soldier' runs in same spot. ulong nFrames; // Self Explanatory? ulong nBones; // Asciiz BoneNames[nBones][32]; // All, in fixed 32 byte records RtmFrame Frames[nFrames]; };
The number of frames (and components in each frame) extend to the end of file. There is no checksum or end of file signature.
RtmFrame
RtmFrame ( float FrameTime; // Values 0.0 to 1.0 /* Represents a percentage of 'time' relative to the total time taken to display all frames. ** The overall time is not indicated in the rtm. External sources cause the 'frames' to move ** fast, or slow, or whatever. See note4 below */ RtmComponent Components[nBones]; };
Note4 Frametime
This is one of those parameters that are easy to understand, and difficult to explain.
The value represents percentage of the expiry time for the entire frameset.
Given ten frames, all of which you want displayed for the same amount of time. the frametime value would progress, 0,0.1,0.2,0.3 etc, not, as would be intuitive, 0.1,0.1,0.1,0.1.........
RtmComponent
RtmComponent { asciiz BoneNames[32]; //Identical to the header above, and in same relative order Transform Transform; //The orientation of the model. See note1 below. };
The exact same number of Components is specified inside every Frame, as per the initial list in exactly the same order. In effect, naming again, in every component, in every frame is redundant.
Transform
Transform { XYZTriplet Triplet[4]; // eg float[4][3] };
This is the transform matrix used directly by Microsoft DirectX engines.
In fact, the 'correct' matrix is actually 4 x 4, but the last column always represents 0,0,0,1 thus
M11,M12 M13 (0.0) M21,M22,M23 (0.0) M31,M32,M33 (0.0) M41,M42,M43 (1.0)
and so is never stored.
This identical matrix is used for WRP files (both formats) and RTM files.
The last row (M41...) happens to be the position of the object X Z Y co-ordinates, and is often referred to separately.
For further information visit
BoneNames
Bonenames apply to p3d models that have skeleton structure. This, chiefly, to class man objects (soldiers, civilians, etc). They are internal to the engines.
There are 25 bone names in ofp, and 65 in arma.
Ofp
hlava(Head) krk(Neck) zebra(Spine) //ribs hrudnik(Spine1 2 or 3) //chest bricho(Pelvis) //abdomen lrameno(LeftShoulder) prameno(RightShoulder) lbiceps(LeftArm) pbiceps(RightArm) lloket(LeftForeArm) ploket(RightForeArm) lruka(LeftHand) pruka(RightHand) //right fist lprsty(LeftHand) pprsty(RightHand) //left right fingers lstehno(LeftUpLeg) pstehno(RightUpLeg) lholen(LeftLeg) pholen(RightLeg) // lower legs lchodidlo(LeftFoot) pchodidlo(RightFoot) lzadek pzadek // right buttock
zbran(weapon) //primary weapon proxy roura(launcher) //secondary weapon proxy
Arma
weapon launcher camera Head Neck Neck1 Spine Spine1 Spine2 Spine3 Pelvis LeftShoulder RightShoulder LeftArm RightArm LeftArmRoll RightArmRoll LeftForeArm RightForeArm LeftForeArmRoll RightForeArmRoll LeftHand RightHand LeftHandThumb1 RightHandThumb1 LeftHandThumb2 RightHandThumb2 LeftHandThumb3 RightHandThumb3 LeftHandIndex1 RightHandIndex1 LeftHandIndex2 RightHandIndex2 LeftHandIndex3 RightHandIndex3 LeftHandMiddle1 RightHandMiddle1 LeftHandMiddle2 RightHandMiddle2 LeftHandMiddle3 RightHandMiddle3 LeftHandRing RightHandRing LeftHandRing1 RightHandRing1 LeftHandRing2 RightHandRing2 LeftHandRing3 RightHandRing3 LeftHandPinky1 RightHandPinky1 LeftHandPinky2 RightHandPinky2 LeftHandPinky3 RightHandPinky3
LeftUpLeg RightUpLeg LeftUpLegRoll RightUpLegRoll LeftLeg RightLeg LeftLegRoll RightLegRoll LeftFoot(pchodidlo) RightFoot LeftToeBase RightToeBase