Internal Animation Format

From Second Life Wiki
Revision as of 22:47, 10 December 2007 by Jacek Antonelli (talk | contribs) (Filled in field types)
Jump to navigation Jump to search

Overview

From a programming perspective, there are several steps to uploading an animation from a BVH (BioVision Hierarchy) file:

  1. Read and parse the BVH file, creating an LLKeyframeMotion object containing the motion data.
  2. 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.
  3. Serialize the LLKeyframeMotion object as LLSD.
  4. Upload the serialized data to the asset server.

Before other viewers can play an animation, they must:

  1. Download the serialized data from the asset server.
  2. 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