Internal Animation Format
Revision as of 20:57, 10 December 2007 by Jacek Antonelli (talk | contribs) (Updated, added LLSD field names for the serialized animation)
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:
- version
- sub_version
- base_priority
- duration
- emote_name
- loop_in_point
- loop_out_point
- loop
- ease_in_duration
- ease_out_duration
- hand_pose
- num_joints
Joint Data
After the header is data for each joint in the skeleton:
- joint_name
- joint_priority
Joint Rotation Keys
At the start of the rotation data is the total number of rotation keys:
- num_rot_keys
Then, for each rotation key:
- time
- rot_angle_x
- rot_angle_y
- rot_angle_z
Joint Position Keys
At the start of the position data is the total number of position keys:
- num_pos_keys
Then, for each position key:
- time
- pos_x
- pos_y
- pos_z
Constraints
After the joint data are a number of entries for joint constraints (whatever that means):
- num_constraints
Then, for each joint constraint:
- chain_length
- constraint_type
- source_volume
- source_offset
- target_volume
- target_offset
- target_dir
- ease_in_start
- ease_in_stop
- ease_out_start
- ease_out_stop