[spacer] [spacer] [spacer]

CS 838 Project 2 Docs : Handling Raw Motion Data

[spacer]

We were fortunate enough to have some very good motion capture data to work with from House of Moves. We had a large set of medieval combat motions, much of it pairs dueling. There was only one catch, the data was still in raw marker data form.

So, we chose to fit a skeletal representation to this marker set. We know how to import such a skeleton into Maya and skin a character to it, so it was a good way to modularize the problem. First get the skeleton, and then we worry about Maya. We also used this skeletal representation to do motion clip blending.

To fit the skeleton, we read a chapter from Michael Gleicher's unwritten book entitled "A Simple Motion Capture Processor". We implemented 5 simple script-like commands described in the unwritten book. Fitting the skeleton is then just a script of these commands operating on the raw marker positions and new temporary markers.

Raw Marker Data
(1) Raw marker data.

Joint Coordinate Systems Fit to Raw Marker Data
(2) Joint coordinate systems fit to raw marker data.

Skeleton Fit to Raw Marker Data
(3) Skeleton with bone lengths fit to joint coordinate systems.

Each joint is a coordinate system oriented according to marker positions we deemed as relevant to that joint. For example, to orient the root joint we used hip markers for position and orientation of one axis, leaving only one degree of freedom to rotate the coordinate system to point upwards into the lower back. We created other joints in exactly the same way. However, we could use previously created joints, or temporary markers to help us along the way.

This was a trial and error process. We could have defined the skeleton in infinitely many ways. We chose a target solution, and tried to get as close to it as possible.

Here are the simple commands used:

position:

a marker M somewhere on the line between 2 given markers A, B.
RM := (1-a)RA + aRB for translation matrices R, and a between 0 and 1.

copy:

a marker M from given marker A.
TM := TA for transformation matrices T.

move:

a marker M along a given vector n in the local marker coordinate system.
TM := TMRn for transformation matrix T and translation matrix R.

rotate:

a marker M about one of the local marker coordinate axes, n, by given degrees q.
TM := TMKn(q) for translation matrix T and rotation matrix K.

orient:

a marker M to given markers A,B such that given coordinate axis n0 of M points towards A. Then rotate about n0 such that second given coordinate axis n1 is pointed as close as possible towards B.
c0 := nA - nM
c1 := nB - nM
c2 := c1 x c0 where the cross-product is ordered by which axes n0, n1 represent.
c0 := c0 x c2 where the cross-product is ordered by which axes n0, n2 represent.
So now we shove the new (normalized) coordinate axes c0, c1, c2 into the translation matrix TM.

We defined the bone lengths, or the offsets to the next joint by hand.

[spacer] [spacer] [spacer]

Last updated May 16, 2002. Andy Selle & Luke Tokheim 

[spacer]