Rtm (Animation) File Format: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
Line 15: Line 15:


==Conventions==
==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===
see [[Generic FileFormat Data Types]]
XYZTriplet
{
  float X,Y,Z;
};


==RtmFile==
==RtmFile==

Revision as of 05:55, 3 August 2009

Template:unsupported-doc

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

see Generic FileFormat Data Types

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

Microsoft


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

       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
weapon
launcher
camera