Suggested BVH Joint Rotation Limits
|Bone||X Range||X Stiffness||Y Range||Y Stiffness||Z Range||Z Stiffness|
|head||-37 to 22||84%||-45 to 45||75%||-30 to 30||83%|
|neck||-37 to 22||84%||-45 to 45||75%||-30 to 30||83%|
|lCollar||Locked||Not Applicable||-30 to 10||89%||-30 to 30||83%|
|rCollar||Locked||Not Applicable||-10 to 30||89%||-30 to 30||83%|
|lShldr||-135 to 90||38%||-180 (-105) to 98||44%||-91 to 97||48%|
|rShldr||-135 to 90||38%||-98 to 180 (105)||44%||-97 to 91||48%|
|lForeArm||-90 to 79||53%||-146 to 0||59%||Locked||Not Applicable|
|rForeArm||-90 to 79||53%||0 to 146||59%||Locked||Not Applicable|
|lHand||-45 to 45||99%||-25 to 36||83%||-90 to 86||51%|
|rHand||-45 to 45||99%||-36 to 25||83%||-86 to 90||51%|
|chest||-45 to 22||81%||-45 to 45||75%||-30 to 30||83%|
|abdomen||-45 to 68||69%||-45 to 45||75%||-30 to 30||83%|
|hip||Not Applicable||Not Applicable||Not Applicable||Not Applicable||Not Applicable||Not Applicable|
|lThigh||-155 to 45||44%||-85 to 105||47%||-17 to 88||71%|
|rThigh||-155 to 45||44%||-105 to 85||47%||-88 to 17||71%|
|lShin||0 to 150||58%||Locked||Not Applicable||Locked||Not Applicable|
|rShin||0 to 150||58%||Locked||Not Applicable||Locked||Not Applicable|
|lFoot||-31 to 63||74%||-26 to 26||86%||-74 to 15||75%|
|rFoot||-31 to 63||74%||-26 to 26||86%||-15 to 74||75%|
This information is useful for preventing animators from hyperextending joints. It's also required by some programs to set up inverse kinematics.
Forward kinematics is animating by rotating the joints manually. Inverse kinematics is animating by moving the end of a chain of bones (often the hands and feet) causing the bones behind it to be pulled along like links in a chain. Most animators use a combination of the two. Inverse kinematics is good for quickly getting the bones into a position close to what you desire. You can then use forward kinematics to fine tune the positions before setting your keyframe. Inverse kinematics can also be useful for quickly placing a hand, elbow, knee, or foot exactly where you want it.
None of the limits above are 'official'. They aren't due to limitations in the simulator or viewer. They aren't based on anything in the built-in animations. They aren't drawn from medical sources. In fact, I was surprised to be unable to find anything like this on the web, despite it being important to anyone making animations for humanoids. I can only say that the animations I've created with these limits look right to my eyes, and I can make most of these bends with my own body (and I'm not double jointed or a gymnast). Information from more reputable sources would be welcome.
When trying to estimate what the joint rotation limits should be it's important to consider actions that bend the joints to extremes.
Actions I considered include:
- touch ear to shoulder
- cross elbows in front of the chest
- cross elbows behind the head
- touch elbows behind the back
- torso tilt to the side (exercise)
- torso twist (exercise)
- crossing legs at the knees
- crossing legs by resting an ankle on the opposite knee
- doing the splits
- swan dive
- baseball pitch
- swinging from a gymnastics high bar (e.g. with your arms behind you)
- walking on the tips of the toes, as in ballet
- toe touch
- hand walking
- several yoga poses:
- both feet behind the head
- bound angle
- extended side angle
- half spinal twist
- standing forward bend with hands clasped behind back
- standing side bend
- upward bow
Several of the limits need some explanation.
The Shldr forward Y rotation limit should normally be 105, but this would make the scorpion yoga pose, and similar positions, impossible. The Y axis is normally used to rotate the arms forward and backward along a approximately horizontal plane, but in positions similar to the scorpion yoga pose it describes rotation along approximately vertical planes, which is what the X axis would normally describe. To place the elbow beside the head either the X or Y axis limit must be 180. If the X axis limit is raised to 180 the Y axis limit must also be raised to 180 to allow the elbow to rest at the side (e.g. to smoothly transition into its position by the head). If the Y axis limit is raised then only that axis needs excessive freedom. The Shldr backward Y rotation limit does not need to be raised, even in positions like the scorpion yoga pose.
Hands should not normally rotate along the X axis, but some X axis rotation is necessary to compensate for the lack of finger control.
Since hip is the root of the bone hierarchy, it rotates the entire body. It therefore has no rotation limits or stiffness.
Joint stiffness controls how easily a joint rotates around a particular axis. When configured properly it causes chains of bones to move realistically when using inverse kinematics.
Most of the time, the greater the range of an axis, the less stiff it should be. For that reason I used the following formula to calculate the stiffness for most axes:
- 1 - abs(start - end)/360
"abs" stands for absolute value
"start" and "end" are variables containing the minimum and maximum values for rotation along that axis
You calculate the percentage of a full 360 degree circle that the rotation limits allow. Since this percentage will increase as rotation range increases, and we want one that decreases as rotation range increases, we subtract it from 1.
There are times when you don't want to use this method; animation tools would not make it configurable otherwise.
I used 105, instead of 180, as the Shldr forward Y axis rotation limit when calculating the stiffness. This best represents the usual behavior of the Y axis and should result in the most natural movement.
Since Hand X axis rotation should be minimized, I listed their stiffness as 99%.