Difference between revisions of "Internal Animation Format"

From Second Life Wiki
Jump to navigation Jump to search
(Updated, added LLSD field names for the serialized animation)
(Table-ized, but haven't filled in types yet)
Line 21: Line 21:
The first part of the animation data is a header describing various details about the animation as a whole. The elements, in order, are:
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
{|{{LLSD Field Table}}
* sub_version
| version ||  || 
* base_priority
|-
* duration
| sub_version ||  || 
* emote_name
|-
* loop_in_point
| base_priority ||  || 
* loop_out_point
|-
* loop
| duration ||  || 
* ease_in_duration
|-
* ease_out_duration
| emote_name ||  || 
* hand_pose
|-
* num_joints
| loop_in_point ||  || 
|-
| loop_out_point ||  || 
|-
| loop ||  || 
|-
| ease_in_duration ||  || 
|-
| ease_out_duration ||  || 
|-
| hand_pose ||  || 
|-
| num_joints ||  || 
|}


==Joint Data==
==Joint Data==
Line 38: Line 51:
After the header is data for each joint in the skeleton:
After the header is data for each joint in the skeleton:


* joint_name
{|{{LLSD Field Table}}
* joint_priority
| joint_name ||  || 
|-
| joint_priority ||  || 
|}


===Joint Rotation Keys===
===Joint Rotation Keys===
Line 45: Line 61:
At the start of the rotation data is the total number of rotation keys:
At the start of the rotation data is the total number of rotation keys:


* num_rot_keys
{|{{LLSD Field Table}}
| num_rot_keys ||  || 
|}


Then, for each rotation key:
Then, for each rotation key:


* time
{|{{LLSD Field Table}}
* rot_angle_x
| time ||  || 
* rot_angle_y
|-
* rot_angle_z
| rot_angle_x ||  || 
|-
| rot_angle_y ||  || 
|-
| rot_angle_z ||  || 
|}


===Joint Position Keys===
===Joint Position Keys===
Line 58: Line 81:
At the start of the position data is the total number of position keys:
At the start of the position data is the total number of position keys:


* num_pos_keys
{|{{LLSD Field Table}}
| num_pos_keys ||  || 
|}


Then, for each position key:
Then, for each position key:


* time
{|{{LLSD Field Table}}
* pos_x
| time ||  || 
* pos_y
|-
* pos_z
| pos_x ||  || 
|-
| pos_y ||  || 
|-
| pos_z ||  || 
|}


==Constraints==
==Constraints==
Line 71: Line 101:
After the joint data are a number of entries for joint constraints (whatever that means):
After the joint data are a number of entries for joint constraints (whatever that means):


* num_constraints
{|{{LLSD Field Table}}
| num_pos_keys ||  || 
|}


Then, for each joint constraint:
Then, for each joint constraint:


* chain_length
{|{{LLSD Field Table}}
* constraint_type
| chain_length ||  || 
* source_volume
|-
* source_offset
| constraint_type ||  || 
* target_volume
|-
* target_offset
| source_volume ||  || 
* target_dir
|-
* ease_in_start
| source_offset ||  || 
* ease_in_stop
|-
* ease_out_start
| target_volume ||  || 
* ease_out_stop
|-
| target_offset ||  || 
|-
| target_dir ||  || 
|-
| ease_in_start ||  || 
|-
| ease_in_stop ||  || 
|-
| ease_out_start ||  || 
|-
| ease_out_stop ||  || 
|}

Revision as of 22:23, 10 December 2007

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
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:

field name description LLSD type C++ type Note
joint_name
joint_priority

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

Then, for each rotation key:

field name description LLSD type C++ type Note
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:

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
pos_x
pos_y
pos_z

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_pos_keys

Then, for each joint constraint:

field name description LLSD type C++ type Note
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