Skinning Mesh Animations data

The data available here is in a complicated binary format. For comparison purposes, other researchers may want only the skinning weights in an easier-to-read format. We are therefore providing them here in a simple text format.


The .skin.txt file contains all the bone transforms, skinning weights, and Eigenskin corrections. The associated .obj file contains the skinning pose of the object and the vertex connectivity. More information on the .obj format can be found here.

.skin.txt format

Lines starting with '#' should be ignored.

The first part is a simple header that lists the name of the associated .obj file:


Next are the bone animations. The header for each of these looks like this:


This tells us that we are starting the bone animation for bone 0, and there are 48 frames in this animation (the number of frames is identical for each bone).

Next, we see a number of lines like this:

0  1.0 -1.5814734E-8 1.148792E-9 7.0695845E-9 3.008339E-8 1.0 -3.8173573E-10 1.2741967E-8 -3.0412197E-11 1.1873943E-9 1.0 -4.7749543E-10 0.0 0.0 0.0 1.0

The first integer is the frame number. The rest of the line is the bone transform for bone 0, frame 0 as a row-major 4 × 4 matrix.

After the bone animations are the vertex weights. The header for these looks like this:

*VERTEXWEIGHTS, NVERTICES=21887  #(vtx0Based bone0 w0 bone1 w1 ... )

where NVERTICES is simply the number of vertices (this should match the count in the .obj file). This is followed by many lines like this:

16439  2 0.9968895 12 0.0 8 0.0 7 0.0031105364

The first number is the vertex index (note that these are 0-indexed, not 1-indexed as in .obj files). Next, we see several entries of the form [INT FLOAT], where the integer refers to the bone index and the floating point value gives the weight associated with that bone for the currect vertex.

Next is the Eigenskin displacement basis. The header for this section is

*DISPLACEMENTBASIS  #(3V rows of U[dof][mode] matrix.) 

The Eigenskin displacement basis is listed in row-major format, with rows separated by a line break. The number of rows is exactly 3 times the number of vertices, and the number of columns can be easily read off by counting the number of floats in a given line. Details on the Eigenskin corrections can be found in our paper or in the original Eigenskin paper.

Next we find the Eigenskin displacement coordinates. The header for this is

*DISPLACEMENTCOORDS, NFRAMES=48  #(rows of QT[frame][mode] matrix.) 

Note that this is stored transposed in the file; that is, the rows that appear in the file correspond to columns of the Q matrix.

The Eigenskin normal basis and Eigenskin displacement basis are stored in a similar format, simply replace *DISPLACEMENTBASIS and *DISPLACEMENTCOORDS with *NORMALBASIS and *NORMALCOORDS.


.skin.txt file.obj file
horse-gallop-01.obj.skinNNLS.txt horse-gallop-01.obj
camel-gallop-48.obj.skinNNLS.txt camel-gallop-48.obj
elephant-gallop-fixed-01.obj.skinNNLS.txt elephant-gallop-fixed-01.obj chickenTexturedFinal.obj snake1.obj


The horse, camel, and elephant animations are all from Robert Sumner's page here. Note that the elephant has been modified slightly to fix an interpenetration in the ears (I simply moved all the vertices out slightly along the normal).

The chicken character was created by Andrew Glassner, Tom McClure, Scott Benza, and Mark Van Langeveld. This short sequence of connectivity and vertex position data is distributed solely for the purpose of comparison of geometry compression techniques. (The original source appears unavailable, but a copy is here.)

The snake, dance, and deformable cow were obtained from the Geometry Videos website.