Difference between revisions of "Internal Animation Format"
Jump to navigation
Jump to search
(Table-ized, but haven't filled in types yet) |
(Filled in field types) |
||
Line 22: | Line 22: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| version || | | version || integer || U16 | ||
|- | |- | ||
| sub_version || | | sub_version || integer || U16 | ||
|- | |- | ||
| base_priority || | | base_priority || integer || S32 | ||
|- | |- | ||
| duration || | | duration || real || F32 | ||
|- | |- | ||
| emote_name || | | emote_name || string || std::string | ||
|- | |- | ||
| loop_in_point || | | loop_in_point || real || F32 | ||
|- | |- | ||
| loop_out_point || | | loop_out_point || real || F32 | ||
|- | |- | ||
| loop || | | loop || integer || S32 | ||
|- | |- | ||
| ease_in_duration || | | ease_in_duration || real || F32 | ||
|- | |- | ||
| ease_out_duration || | | ease_out_duration || real || F32 | ||
|- | |- | ||
| hand_pose || | | hand_pose || integer || U32 | ||
|- | |- | ||
| num_joints || | | num_joints || integer || U32 | ||
|} | |} | ||
Line 52: | Line 52: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| joint_name || | | joint_name || string || std::string | ||
|- | |- | ||
| joint_priority || | | joint_priority || integer || S32 | ||
|} | |} | ||
Line 62: | Line 62: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| num_rot_keys || | | num_rot_keys || integer || S32 | ||
|} | |} | ||
Line 68: | Line 68: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| time || | | time || integer || U32 | ||
|- | |- | ||
| rot_angle_x || | | rot_angle_x || integer || U16 | ||
|- | |- | ||
| rot_angle_y || | | rot_angle_y || integer || U16 | ||
|- | |- | ||
| rot_angle_z || | | rot_angle_z || integer || U16 | ||
|} | |} | ||
Line 82: | Line 82: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| num_pos_keys || || | | num_pos_keys || || | ||
|} | |} | ||
Line 88: | Line 88: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| time || | | time || integer || U32 | ||
|- | |- | ||
| pos_x || | | pos_x || integer || U16 | ||
|- | |- | ||
| pos_y || | | pos_y || integer || U16 | ||
|- | |- | ||
| pos_z || | | pos_z || integer || U16 | ||
|} | |} | ||
Line 102: | Line 102: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| | | num_constraints || integer || U32 | ||
|} | |} | ||
Line 108: | Line 108: | ||
{|{{LLSD Field Table}} | {|{{LLSD Field Table}} | ||
| chain_length || | | chain_length || integer || U8 | ||
|- | |- | ||
| constraint_type || | | constraint_type || integer || U8 | ||
|- | |- | ||
| source_volume || | | source_volume || uuid (?) || U8 array | ||
|- | |- | ||
| source_offset || | | source_offset || string (?) || LLVector3 | ||
|- | |- | ||
| target_volume || | | target_volume || uuid (?) || U8 array | ||
|- | |- | ||
| target_offset || | | target_offset || string (?) || LLVector3 | ||
|- | |- | ||
| target_dir || | | target_dir || string (?) || LLVector3 | ||
|- | |- | ||
| ease_in_start || | | ease_in_start || real || F32 | ||
|- | |- | ||
| ease_in_stop || | | ease_in_stop || real || F32 | ||
|- | |- | ||
| ease_out_start || | | ease_out_start || real || F32 | ||
|- | |- | ||
| ease_out_stop || | | ease_out_stop || real || F32 | ||
|} | |} |
Revision as of 22:47, 10 December 2007
Overview
From a programming perspective, there are several steps to uploading an animation from a BVH (BioVision Hierarchy) file:
- Read and parse the BVH file, creating an LLKeyframeMotion object containing the motion data.
- Gather input from the user (via the upload preview floater) for things like animation priority, facial expression, and looping; these settings are stored in the LLKeyframeMotion object.
- Serialize the LLKeyframeMotion object as LLSD.
- Upload the serialized data to the asset server.
Before other viewers can play an animation, they must:
- Download the serialized data from the asset server.
- Deserialize it to an LLKeyframeMotion object.
Relevant source files:
- linden/indra/llcharacter/llbvhloader.cpp
- linden/indra/llcharacter/llkeyframemotion.cpp.
Header
The first part of the animation data is a header describing various details about the animation as a whole. The elements, in order, are:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
version | integer | U16 | ||
sub_version | integer | U16 | ||
base_priority | integer | S32 | ||
duration | real | F32 | ||
emote_name | string | std::string | ||
loop_in_point | real | F32 | ||
loop_out_point | real | F32 | ||
loop | integer | S32 | ||
ease_in_duration | real | F32 | ||
ease_out_duration | real | F32 | ||
hand_pose | integer | U32 | ||
num_joints | integer | U32 |
Joint Data
After the header is data for each joint in the skeleton:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
joint_name | string | std::string | ||
joint_priority | integer | S32 |
Joint Rotation Keys
At the start of the rotation data is the total number of rotation keys:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
num_rot_keys | integer | S32 |
Then, for each rotation key:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
time | integer | U32 | ||
rot_angle_x | integer | U16 | ||
rot_angle_y | integer | U16 | ||
rot_angle_z | integer | U16 |
Joint Position Keys
At the start of the position data is the total number of position keys:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
num_pos_keys |
Then, for each position key:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
time | integer | U32 | ||
pos_x | integer | U16 | ||
pos_y | integer | U16 | ||
pos_z | integer | U16 |
Constraints
After the joint data are a number of entries for joint constraints (whatever that means):
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
num_constraints | integer | U32 |
Then, for each joint constraint:
field name | description | LLSD type | C++ type | Note |
---|---|---|---|---|
chain_length | integer | U8 | ||
constraint_type | integer | U8 | ||
source_volume | uuid (?) | U8 array | ||
source_offset | string (?) | LLVector3 | ||
target_volume | uuid (?) | U8 array | ||
target_offset | string (?) | LLVector3 | ||
target_dir | string (?) | LLVector3 | ||
ease_in_start | real | F32 | ||
ease_in_stop | real | F32 | ||
ease_out_start | real | F32 | ||
ease_out_stop | real | F32 |