3dsMax BVH import specification

The 3dsMax 2009 built-in documentation refers to a file called "bvh.rtf" which, the documentation implies, is on the 3dsMax release DVD or hidden somewhere in your 3dsMax directory structure. I managed to track down a copy of what seems to be the most recent (early 2009) version of this file, so I'll put it here for reference. This file describes in detail what the joint structure of a BVH file needs to look like for 3dsMax Biped import to work with it.

The information below is from Autodesk, not cgspeed.com, and I provide it here simply as a courtesy to Max and BVH users.

- Bruce

___________________________________________________________________________

CS/MAX8 BVH File Format Specification

Character Studio for MAX8 has many new enhancements for BVH import:

1)Support for up to 7 spine links.

The naming convention is: Chest, Chest2, Chest3, Chest4, Chest5, Chest6, Chest7

“Chest” is the first link at the base of the pelvis.

2)Support for optional finger data. The fingers may have up to 3 links each (0,1,2), and the

naming convention is as follows (with Finger0 representing the thumb across to Finger4 that

represents the pinky finger):

Link 0 Link1 Link 2

-------- ------- ---------

Right Thumb: RightFinger0, RightFinger01, RightFinger02,

Right Finger1: RightFinger1, RightFinger11, RightFinger12,

Right Finger2: RightFinger2, RightFinger21, RightFinger22,

Right Finger3: RightFinger3, RightFinger31, RightFinger32,

Right Finger4: RightFinger4, RightFinger41, RightFinger42,

Left Thumb: LeftFinger0, LeftFinger01, LeftFinger02,

Left Finger1: LeftFinger1, LeftFinger11, LeftFinger12,

Left Finger2: LeftFinger2, LeftFinger21, LeftFinger22

Left Finger3: LeftFinger3, LeftFinger31, LeftFinger32

Left Finger4: LeftFinger4, LeftFinger41, LeftFinger42

3)Support for optional bending toes:

The naming convention is: RightToe and LeftToe

4)Support for independent neck motion data

Unlike previous versions, the neck rotations are correctly imported onto the biped figure.

General Information


Biped provides direct input of BVH files from disk, including comprehensive key-frame

reduction and footstep extraction to provide a fast and accurate means of import for

large volumes of rotational data stored in the BVH format.

Biped uses rotational data stored in the BVH format to pose a Biped character

on a frame-by-frame basis and to move it forward in time. During import, XYZ Euler

joint rotations stored in the BVH file are used to derive Quaternion bone rotation

data for the biped at each frame.

Once imported, BVH-based animations can be saved out as native Biped .bip files,

providing access to a comprehensive set of animation, layered editing, retargeting

and structural modification features that are built directly into Biped.

Overview of BVH-supported Hierarchy and Naming

Biped supports a specific BVH hierarchy and naming scheme, as generated by BioVision

Motion Capture Studios. This specific hierarchy allows for automatic mapping of BVH

data to the Biped character.

Parsing order of sibling nodes in the hierarchy is arbitrary. That is, the order of

sibling nodes can be altered as long as their parent-child relationships do not change.

The supported hierarchy and required node/bone names are listed below. Note that an a

lternative naming scheme for some nodes is shown in (). The {} notation is used to

clarify the parent-child hierarchy between nodes.

Hips {

LeftHip (LeftUpLeg) {

LeftKnee (LeftLowLeg) {

LeftAnkle (LeftFoot) {

End Site {}

} } }

RightHip (RightUpLeg) {

RightKnee (RightLowLeg) {

RightAnkle (RightFoot) {

End Site {}

} } }

Chest {

LeftCollar {

LeftShoulder (LeftUpArm) {

LeftElbow (LeftLowArm) {

LeftWrist (LeftHand) {

End Site {}

} } } }

RightCollar {

RightShoulder (RightUpArm) {

RightElbow (RightLowArm) {

RightWrist (RightHand) {

End Site {}

} } } }

Neck {

Head {

End Site {}

} } } }

Character Studio Marker Name File (MNM)

The Character Studio Marker Name file is generally used to match custom marker

names in the CSM file with Biped preset list of known, supported marker names.

When importing bvh motion capture files, the mnm file can also be used to specify

an alternative naming scheme for Biped's fixed hierarchy supported joints (as listed above).

The general syntax of the MNM file consists of two columns of names.

The left column corresponds to Biped's known BVH joint names.

The column on the right corresponds to the custom joint names stored in a specific BVH file.

There should be an entry for every custom BVH joint name in the BVH file. For

completeness, all BVH joints can be listed and correlated to internal Biped

names, even if the names are identical.

The listing below is an "identity" listing of fixed versus custom joint name

(the columns on the left and right are identical).

Optional (missing) marker name entries not in the BVH file can be omitted from the

MNM marker file.

This list can be easily copied and modified (via the right column) for each unique

motion capture session sample. New CS/MAX8 supported bones are highlighted in bold.

Hips

LeftHip lfemur

LeftKnee ltibia

LeftAnkle lfoot

LeftToe ltoe

RightHip rfemur

RightKnee rtibia

RightAnkle rfoot

RightToe rtoe

Chest upperback

Chest2 thorax

Chest3 spine_bone3

Chest4 spine_bone4

.

.

.

Chest7 spine_bone7

LeftCollar lshoulderjoint

LeftShoulder lhumerus

LeftElbow lradius

LeftWrist lwrist

LeftFinger0 lThumb_0Bone

LeftFinger01 lThumb_1Bone

LeftFinger02 lThumb_2Bone

LeftFinger1 lfinger1_0Bone

LeftFinger11 lfinger1_1Bone

LeftFinger12 lfinger1_2Bone

.

.

.

LeftFinger4 lfinger4_0Bone

LeftFinger41 lfinger4_1Bone

LeftFinger42 lfinger4_2Bone

RightCollar rshoulderjoint

RightShoulder rhumerus

RightElbow rradius

RightWrist rwrist

RightFinger0 rThumb_0Bone

RightFinger01 rThumb_1Bone

RightFinger02 rThumb_2Bone

RightFinger1 rfinger1_0Bone

RightFinger11 rfinger1_1Bone

RightFinger12 rfinger1_2Bone

.

.

.

RightFinger4 rfinger4_0Bone

RightFinger41 rfinger4_1Bone

RightFinger42 rfinger4_2Bone

head head

neck neck

Establishing a Correct Neutral Pose

In creating a BVH file that can be read into Character Studio Biped and displayed

correctly, it is critical that the effective neutral pose of the BVH match Biped's

neutral pose. That is, the hierarchy, bone lengths, and initial rotations

specified in the HIERARCCHY section of the BVH file must create a figure that

matches the default pose of a newly-created Biped figure. The initial pose

for Biped places the biped figure upright along the +Z axis, facing "forward"

along the -Y axis, left hand on the +X axis. Hands are oriented with palms

against the outside thighs, with thumb on the forward side; fingers and thumb

of each hand outstretched (open) facing "down" along the -Z axis. Legs are

together and straight at the knees.

A correctly oriented BVH file can be verified by setting all rotational values

in the first frame of the MOTION section to zeroes. When all joint rotation

values are set to zero for the first frame of the BVH file, the results

displayed at frame zero in Biped, after import, should match the default

position of the Biped exactly.

General BVH File Structure

The BVH file is divided into two major sections: HIERARCHY and MOTION.

The HIERARCHY section describes the joint-to-joint connections and offsets

for the sampled motion data.

The MOTION section describes the movement of these individual joints on a

per-sample basis.

CHANNELS information listed within a specific node of the HIERARCHY section

signals the existence of corresponding XYZ data streams in the MOTION section

which follows. CHANNELS information represents the bulk of the BVH file data.

In the MOTION section, each row contains data values for all CHANNELS which

were specified in the HIERARCHY. Each successive row contains a single time

sample for all CHANNELS. The listing order of CHANNELS values in each

row in the MOTION section is implicitly assumed to match their listed

order from the HIERARCHY section (top down).

All string names must appear exactly as shown below, with the exception of

nodes names (e.g. LeftHip, LeftKnee, etc) for which alternative naming

schemes have been listed above.

CHANNELS data that corresponds to unrecognized JOINT names will be ignored.

The [] notation indicates values or strings that should be used in the actual file.

---------------------------- File Starts Here ---------------------

HIERARCHY

ROOT Hips

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation

JOINT LeftHip

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftKnee

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftAnkle

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET [x_float] [y_float] [z_float]

}

}

}

}

JOINT RightHip

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightKnee

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightAnkle

{

OFFSET [x_float] [y_float] [z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET [x_float] [y_float] [z_float] }

}

}

}

JOINT Chest

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftCollar

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftShoulder

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftElbow

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftWrist

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET [x_float y_float z_float]

}

}

}

}

}

JOINT RightCollar

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightShoulder

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightElbow

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightWrist

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET [x_float y_float z_float]

}

}

}

}

}

JOINT Neck

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT Head

{

OFFSET [x_float y_float z_float]

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET [x_float y_float z_float]

}

}

}

}

}

MOTION

Frames: [number_of_time_samples_to_follow]

Frame Time: [0.033333]

[samp1_chan1_float] [samp1_chan2_float] ... [samp1_chanN_float]

[samp2_chan1_float] [samp2_chan2_float] ... [samp2_chanN_float]

...

[sampN_chan1_float] [sampN_chan2_float] ... [sampN_chanN_float]

------------ end of file ----------------------------------

Example Biped-supported BVH File with 3 independent spine links, toes, and fingers

-----to test: cut here and paste into “test.bvh” file------------------------

HIERARCHY

ROOT Hips

{

OFFSET 0.355103 3.94642 -0.808935

CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation

JOINT Chest

{

OFFSET 0 0.113126 -0.0348888

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT Chest2

{

OFFSET 0 0.612861 0.000119536

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT Chest3

{

OFFSET 0 0.462725 -0.000241021

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT Neck

{

OFFSET 0 0.777749 -0.0738766

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT Head

{

OFFSET 0 0.367648 0.0876601

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET 0 0.745028 0.147526

}

}

}

JOINT LeftCollar

{

OFFSET 0.156441 0.698731 -0.0440271

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftUpArm

{

OFFSET 0.372121 -0.135441 0

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftLowArm

{

OFFSET 0.637882 -0.767829 -0.0108791

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftHand

{

OFFSET 0.584657 -0.703957 0.0313351

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftFinger0

{

OFFSET 0.0406017 -0.101629 0.146634

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftFinger01

{

OFFSET 0.0456647 -0.14047 0.110699

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET 0.0553814 -0.113069 0.0336022

}

}

}

JOINT LeftFinger1

{

OFFSET 0.250233 -0.250471 0.124973

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftFinger11

{

OFFSET 0.0819137 -0.105314 0.0107667

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET 0.028819 -0.124616 0.00914457

}

}

}

JOINT LeftFinger2

{

OFFSET 0.257071 -0.258304 -0.0439469

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftFinger21

{

OFFSET 0.0653642 -0.130915 0.00458132

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET 0.00283215 -0.146002 0.00347374

}

}

}

}

}

}

}

JOINT RightCollar

{

OFFSET -0.156439 0.698732 -0.0440276

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightUpArm

{

OFFSET -0.372121 -0.13544 0

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightLowArm

{

OFFSET -0.637885 -0.767827 -0.0108808

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightHand

{

OFFSET -0.584659 -0.703956 0.0313335

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightFinger0

{

OFFSET -0.0406021 -0.101629 0.146634

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightFinger01

{

OFFSET -0.0456653 -0.14047 0.110699

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET -0.0553819 -0.113069 0.0336021

}

}

}

JOINT RightFinger1

{

OFFSET -0.250233 -0.250471 0.124972

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightFinger11

{

OFFSET -0.081914 -0.105313 0.0107665

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET -0.0288194 -0.124616 0.00914448

}

}

}

JOINT RightFinger2

{

OFFSET -0.257071 -0.258303 -0.0439476

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightFinger21

{

OFFSET -0.0653643 -0.130915 0.00458113

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET -0.00283254 -0.146002 0.00347371

}

}

}

}

}

}

}

}

}

}

JOINT LeftHip

{

OFFSET 0.366705 0 0

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftLowLeg

{

OFFSET -0.0516087 -1.73613 -0.0200994

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftFoot

{

OFFSET -0.0454942 -1.5773 -0.111522

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT LeftToe

{

OFFSET 0.0265494 -0.371667 0.383426

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET 0.0216431 0 0.312564

}

}

}

}

}

JOINT RightHip

{

OFFSET -0.366705 0 0

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightLowLeg

{

OFFSET 0.0516041 -1.73613 -0.0200993

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightFoot

{

OFFSET 0.0454903 -1.5773 -0.111522

CHANNELS 3 Zrotation Xrotation Yrotation

JOINT RightToe

{

OFFSET -0.0265514 -0.371667 0.383426

CHANNELS 3 Zrotation Xrotation Yrotation

End Site

{

OFFSET -0.021644 0 0.312564

}

}

}

}

}

}

MOTION

Frames: 4

Frame Time: 0.0333333

0.186767 3.91862 -0.443967 -0.882252 1.84828

-1.64638 0.0659705 0.161547 -0.297068

0.0851066 0.258282 -0.475434 0.106243 0.32265

-0.594412 1.02206 -2.08568 0.37822 2.02006

-4.15309 0.907096 20.9573 1.52272 4.69015 23.7097

-10.0718 5.07481 4.19437 -6.9713 -1.4365

-9.04738 4.50705 3.96434 5.07193 6.97702 8.69036

-5.59548 -13.2114 -8.70983 -26.9741 4.06586

2.18869 -36.5562 2.50153 -1.52111 -14.8409 0.424898

-0.337248 -37.081 1.08577 -0.563483

-20.5514 -0.943333 3.96504 -28.0064 -7.36905 -7.48025

-4.45858 -10.4609 -3.57536 2.66011

5.5298 -4.70457 -21.8438 -14.1597 -13.113 7.12214

-15.9554 10.8377 24.2152 2.87098 -1.21089

34.2697 2.32153 1.47545 13.6045 0.389237 0.316215 35.1744

1.02332 0.552501 10.3939 -2.65556 1.5291

0.384103 0.965636 5.33499 -8.35851 0.912035 0.63068

-0.00326704 0.0471816 9.36283e-007 -6.55988

-2.62101 -4.41285 -0.484818 1.42671 -6.75701 6.41962

0.954417 -0.479308 -0.0635083 -0.917054 -0.000500319

0.185259 3.91844 -0.443769 -0.909038 1.9051 -1.63335

0.0698739 0.169003 -0.308446 0.0919596 0.270174

-0.493674 0.114814 0.337487 -0.617228 0.933323 -2.1512

0.375639 1.84266 -4.28632 0.890751 20.7859

1.47879 4.57826 24.3971 -9.21427 4.74322 4.5923 -3.8843

-6.17871 -13.7096 4.61051 4.19751 1.64758

8.34833 7.16695 -5.50287 -13.0356 -8.57835 -22.6987

4.00248 2.15185 -28.0452 1.84 -1.31521 -10.4381

0.299197 -0.25876 -28.2755 0.798346 -0.495584 -20.7318

-1.00668 4.14057 -28.0753 -7.72909 -8.35309

-4.43778 -8.50148 -0.0829734 4.50999 6.5029 -5.65706

-20.6273 -12.5854 -12.5456 6.70966 -15.241

10.2696 23.5121 2.84881 -1.21929 32.8677 2.21171 1.44393

12.881 0.368428 0.303533 33.7272 0.975695

0.542809 10.4449 -2.70049 1.57912 0.379237 0.948679 5.26743

-8.34136 0.931725 0.630188 -0.00480122

0.0693378 2.30427e-006 -6.51384 -2.6449 -4.43749 -0.48451

1.3824 -6.76411 6.45626 0.959172 -0.482331

-0.0617148 -0.891161 -0.000472244

0.18378 3.91826 -0.442936 -0.943707 2.00496 -1.61155

0.0767651 0.154166 -0.331402 0.101772 0.246375

-0.530435 0.127068 0.307692 -0.663179 0.86168

-2.17526 0.41929 1.6957 -4.33503 0.967533 20.7207

1.47345 4.57063 25.0001 -9.11527 5.14494 5.27656

-1.24288 -11.0096 -18.8196 5.0239 4.83549

-1.40115 9.74054 5.90934 -5.28589 -12.6195 -8.26909

-17.5893 3.92339 2.11418 -17.873 1.10002

-0.944228 -5.15526 0.156881 -0.152204 -17.7105 0.472246

0.357323 -20.9599 -1.14225 4.53045 -28.1119

-7.69388 -9.10778 -4.69874 -5.67933 4.59475 6.47075

6.92324 -6.16068 -17.9969 -10.2858 -11.1127 6.0675

-14.0895 9.37527 21.4053 2.78306 -1.24609 28.6669 1.88773

1.33355 10.7163 0.307148 0.264031 29.3979

0.834875 0.506676 10.52 -2.77796 1.76478 0.367458 0.935521

5.09504 -8.3907 0.909251 0.633092

-0.00579624 0.0837076 3.50867e-006 -6.44586 -2.70615

-4.36519 -0.490749 1.34725 -6.86903 6.42257

0.956543 -0.479598 -0.0603795 -0.871882 -0.000451867

0.182163 3.91827 -0.441332 -0.97265 2.14377

-1.5594 0.0783924 0.125946 -0.329994 0.103288

0.201219 -0.528198 0.128956 0.251244 -0.66036 0.81425

-2.19708 0.426293 1.60012 -4.37963 0.974826

20.7647 1.45991 4.5227 25.3242 -9.60225 5.95316 6.07586

0.613846 -15.1723 -22.431 5.64043 5.7521

-4.20675 11.8436 5.5206 -4.75266 -11.5696 -7.50178

-13.2057 3.85309 2.0876 -9.14296 0.525782

-0.525905 -0.615962 0.0428758 -0.0505077 -8.63247

0.216326 -0.192413 -21.1502 -1.18742 4.64377

-28.172 -7.64815 -9.61196 -5.32879 -2.75455 9.76647

8.56034 7.72017 -7.07087 -14.2266 -7.60985

-9.0033 5.8317 -13.6541 9.04365 18.4778 2.69341

-1.2873 22.8296 1.45274 1.14141 7.70314 0.224427

0.205257 23.372 0.644253 0.438918 10.5907 -2.88858

1.88129 0.358622 0.908691 4.97038 -8.42551 0.898283

0.635345 -0.00481386 0.0695204 2.31801e-006 -6.37896

-2.79166 -4.28458 -0.498999 1.31693 -7.00317 6.37356

0.936778 -0.475203 -0.0624271 -0.901444 -0.000483296

-----end cut here----------------



GENERAL NOTES ABOUT GETTING PRECISE BVH CONVERSION OF LIMBS

---------------------------------------------------------------

BIPED has built in anthropomorphic constraints that require that:

* Elbows and Knees are one degree-of-freedom hinge joints. The axis of

rotation of the hinge should ideally always be perpendicular to the arm's

shoulder-elblow-wrist triangle and the leg's hip-knee-ankle triangle.

Therefore, its ideal if the BVH Euler angles for the leg and arm bones

match this orientation constraint with no added twists or deviations.

If the hinge joint constraint is violated, BIPED's converter must decide

whether to satisfy the orientation data or satisfy the elbow/knee

positioning based solely on the point locations.

In the Mocap Conversion Parameters Dialogue Box:

If the "Angle" radio button is specified, the limb's triangle attempts

to match the hinge to the Euler matrix axes. This may deviate from the position posture.


If the "Point" radio button is specified, the limb's triangle matches

the positions of the actual points. This may deviate from the specified

Euler angle matrix.

However, in both cases, the limb always moves to hit the IK position of the

wrist or ankle, so if Euler angles are given that are not aligned with the

natural hinge joint, the axis is projected to nearest axis that satisfies

the wrist/ankle IK constraint (that is, one axis must be normal to the line

joining the arm's shoulder-wrist or the leg's hip-ankle).