# Why MOCAP data don't use simple point coordinates?

This might sound stupid for you but I really don't know how it works in the domain of 3d animation and motion capture, but I need to work with ASF/AMC files at the moment and I find it a little bit complex to understand (being a non-native english speaker does not help).

So the question is, why motion captures main file types don't use simple joint coordinates for the skeleton?

Edit: I am particularly thinking about Acclaim ASF/AMC format mainly because I need to use it with an imlementation of an algorithm that use joint vertex positions and deltas from initial position for the motion part. Having looked at how the data are represented it makes more sense to me to represent skeletons as joint vertex and motion as deltas between the intial skeleton and the new moved one.

• Your question looks interesting, but it's missing a key element. What does your MOCAP data actually use then instead of "simple joint coordinates"? – bernie Dec 18 '18 at 16:07
• I have edited the question to provide this information, I can give little explanations about the format if needed. – Nicolas Scotto Di Perto Dec 18 '18 at 16:18
• I'm not familiar with that format and I bet many others are not either. If you explain what it contains perhaps someone who knows mocap in general will be able to answer. – bernie Dec 18 '18 at 16:39
• @bernie ASF/AMC files are the Acclaim motion capture format which is used, for example, in the well-known CMU Motion Capture Database. – Rahul Dec 21 '18 at 7:40

Joint coordinates alone don't give you enough information about rotation.

For example, hold out your arm to your side. Notice that you still have one degree of freedom to twist the arm without affecting the positions of your elbow or wrist. Thus, if you had a motion capture format that stored only those coordinates, you would not be able to distinguish these poses.

I'm not familiar with different motion capture file formats and exactly what they contain, but I have done some work on animating skeletons of life forms so here's my take on it.

When you draw something using a skeleton to animate it, you start with a "root" bone which will obviously have a position as can be seen in this example walk.asf file:

:root
axis XYZ
order TX TY TZ RZ RY RX
position 0.0 0.0 0.0
orientation 0.0 0.0 0.0


The next bonedata section defines all the bones:

:bonedata
begin
id 1
name hips
direction 0.000000 1.000000 0.000000
length 0.000000
axis 0.00000 0.00000 0.00000 XYZ
dof rx ry rz
limits (-180.0 180.0)
(-180.0 180.0)
(-180.0 180.0)
end
# other bone definitions follow


There is then a hierarchy of bones starting from this root bone:

begin
root hips
hips hips1 hips2 hips3
hips1 chest
chest chest1 chest2 chest3
chest1 neck
# ...
hips2 leftupleg
# ...
hips3 rightupleg
end


(by the way, this is the kind of information I asked for in my comments and that you should have provided for a clearer question.)

Each "child" bone is connected to the endpoint of its parent and it defines its own orientation relative to that parent. This picture helps (taken from Autodesk Motionbuilder's doc)

To position any given bone, you need to go up the bone hierarchy to the root bone and combine all their transformation matrices together. For example, to position bone chest, the following sequence is used: root -> hips -> hips1 -> chest. Each of these bones has its own transformation (rotation, stretch) based on the motion capture data which affects the position of its children. The root bone is a special case that has no parents and represents the position and orientation of the whole model.

Motion capture data cannot contain only bone positions because rotation in the axis of the bone cannot be expressed otherwise. Finally, it makes more sense to have motion capture data in terms of rotation and stretch because these values can be interpolated more easily than position and it's what is used anyway to render the skeleton.

• By the way, the ASF files mentioned in the question are exactly the same format as the .asf file you use as an example in your answer :) – Rahul Dec 21 '18 at 14:38