Open Source Platform
for interconnected virtual worlds

Avatar Appearance Working Group

From Rex community wiki

The goal of this Working Group is to find plan/spesification how to implement delivery of avatar appearance.

Contents

Current implementation (0.4)

image:Avatarappearance0.4.png

First after user logs in, simulator fetches the users avatar URI from the authentication server. Example: http://192.168.0.101:10000/avatar/59538445b2294a08b5ce0d60daeb894d

After this simulator delivers this address to all users so everyone can see the user.

Each user then start to fetch avatar appearance from Avatar Storage server. The avatar appearance is returned as a list of assets with SHA key and one XML file describing avatar. See examples 1 & 2.

After fetching avatar description, client checks all assets from the cache and fetches the missing ones from Authentication server with REST. Example URI: http://192.168.0.101:10000/item/iBIR/AkwezeOFwTZij8/y1zqrk0=

Asset data is returned as wrapped in XML. Example:

<llsd><map><key>iBIR/AkwezeOFwTZij8/y1zqrk0=</key><binary encoding="base64">--Binarydata--</binary></map></llsd>

Example 1

Response for avatar REST call.

<llsd>
 <map>
  <key>some_mesh</key>
  <string>SHA_of_that_mesh</string>
  <key>some_material_name</key>
  <string>SHA_id_of_that_material</string>
  <key>generic xml</key>
  <string>large xml file. see example</string>
  <key>some_mesh</key>
  <string>SHA_of_that_mesh</string>
  <key>some_material_name</key>
  <string>SHA_id_of_that_material</string>
 </map>
</llsd>


Example 2

The "generic xml" in avatar REST response.

<?xml version="1.0" encoding="utf-8" ?>
<avatar>
   <version>0.2</version>
   <base name="default_female" mesh="Jack.mesh" />
   <skeleton name="Jack.skeleton" />
   <material name="oYSLVx8iA7zB5Lo7QX5S2qi6Eq0=" />
   <material name="33BFClXFGkMUpSv8P8asLwaKB9A=" />
   <texture_face name="Jack_face_wild.jpg" />
   <texture_body name="" />
   <appearance height="1.800000" weight="1" />
   <transformation position="0 0 0" rotation="1 0 0 0" scale="1 1 1" />
   <attachment>
       <name value="Male_cap.xml" />
       <mesh name="malehat.mesh" linkskeleton="0" />
       <category name="Hat">
           <bone name="Bip01_Head" />
       </category>
       <avatar name="Jack.mesh">
           <bone name="Bip01_Head" offset="0.135119 -0.0084848 -0.000272648" rotation="1 -0 0 0" scale="1.07 1.07 1.07" />
       </avatar>
   </attachment>
   <attachment>
       <name value="Male_hiphop_jacket.xml" />
       <mesh name="Male_hiphop_jacket.mesh" linkskeleton="1" />
       <category name="Top">
           <bone name="None" />
       </category>
       <avatar name="Jack.mesh">
           <bone name="None" offset="0 0 0" rotation="1 0 0 0" scale="1 1 1" />
           <avatar_polygon idx="0" />
           <avatar_polygon idx="1" />
           <avatar_polygon idx="2" />
           <avatar_polygon idx="2812" />
           <avatar_polygon idx="2813" />
           <avatar_polygon idx="2815" />
       </avatar>
   </attachment>
   <attachment>
       <name value="Male_hiphop_trousers_jeans.xml" />
       <mesh name="Male_hiphop_trousers_jeans.mesh" linkskeleton="1" />
       <category name="Bottom">
           <bone name="None" />
       </category>
       <avatar name="Jack.mesh">
           <bone name="None" offset="0 0 0" rotation="1 0 0 0" scale="1 1 1" />
           <avatar_polygon idx="51" />
           <avatar_polygon idx="52" />
           <avatar_polygon idx="53" />
           <avatar_polygon idx="2759" />
           <avatar_polygon idx="2760" />
           <avatar_polygon idx="2761" />
       </avatar>
   </attachment>
   <dynamic_animation_parameter name="Height_Adjust1" position="0.5" />
   <dynamic_animation name="Height_Adjust1">
       <base_animations />
       <bones>
           <bone name="Bip01_Pelvis">
               <rotation start="0 0 0" end="0 0 0" mode="absolute" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="0.93 0.93 0.93" end="1.07 1.07 1.07" />
           </bone>
           <bone name="Bip01_Spine1">
               <rotation start="0 0 0" end="0 0 0" mode="absolute" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="0.97 0.97 0.97" end="1.03 1.03 1.03" />
           </bone>
           <bone name="Bip01_L_Thigh">
               <rotation start="0 0 0" end="0 0 0" mode="absolute" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="0.93 0.93 0.93" end="1.07 1.07 1.07" />
           </bone>
           <bone name="Bip01_R_Thigh">
               <rotation start="0 0 0" end="0 0 0" mode="absolute" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="0.93 0.93 0.93" end="1.07 1.07 1.07" />
           </bone>
       </bones>
   </dynamic_animation>
   <dynamic_animation_parameter name="Widen_Clavicles1" position="0" />
   <dynamic_animation name="Widen_Clavicles1">
       <base_animations />
       <bones>
           <bone name="Bip01_L_Clavicle">
               <rotation start="0 0 0" end="0 0 0" mode="absolute" />
               <translation start="0 0 0" end="0 0 0.05" mode="relative" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_R_Clavicle">
               <rotation start="0 0 0" end="0 0 0" mode="absolute" />
               <translation start="0 0 0" end="0 0 -0.05" mode="relative" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
       </bones>
   </dynamic_animation>
   <dynamic_animation_parameter name="Spine_Posture1" position="0.5" />
   <dynamic_animation name="Spine_Posture1">
       <base_animations />
       <bones>
           <bone name="Bip01_Spine1">
               <rotation start="0 0 -20" end="0 0 20" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_Head">
               <rotation start="0 0 15" end="0 0 -15" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_R_UpperArm">
               <rotation start="0 0 20" end="0 0 -20" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_L_UpperArm">
               <rotation start="0 0 20" end="0 0 -20" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
       </bones>
   </dynamic_animation>
   <dynamic_animation_parameter name="Leg_Twist1" position="0" />
   <dynamic_animation name="Leg_Twist1">
       <base_animations />
       <bones>
           <bone name="Bip01_L_Thigh">
               <rotation start="0 0 0" end="0 -10 0" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_L_Calf">
               <rotation start="0 0 0" end="0 -20 0" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_R_Thigh">
               <rotation start="0 0 0" end="0 10 0" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_R_Calf">
               <rotation start="0 0 0" end="0 20 0" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
       </bones>
   </dynamic_animation>
   <dynamic_animation_parameter name="Arm_Twist1" position="0" />
   <dynamic_animation name="Arm_Twist1">
       <base_animations />
       <bones>
           <bone name="Bip01_L_UpperArm">
               <rotation start="0 0 0" end="0 -20 0" mode="cumulative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_L_Forearm">
               <rotation start="0 0 0" end="0 10 0" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_R_UpperArm">
               <rotation start="0 0 0" end="0 20 0" mode="cumulative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
           <bone name="Bip01_R_Forearm">
               <rotation start="0 0 0" end="0 -10 0" mode="relative" />
               <translation start="0 0 0" end="0 0 0" mode="absolute" />
               <scale start="1 1 1" end="1 1 1" />
           </bone>
       </bones>
   </dynamic_animation>
   <morph_modifier name="fat-arms-lower" internal_name="Morph_fat-arms-lower" influence="0.000000" />
   <morph_modifier name="fat-arms-upper" internal_name="Morph_fat-arms-upper" influence="0.000000" />
   <morph_modifier name="fat-body-lower" internal_name="Morph_fat-body-lower" influence="0.000000" />
   <morph_modifier name="fat-body-upper" internal_name="Morph_fat-body-upper" influence="0.000000" />
   <morph_modifier name="fat-legs-lower" internal_name="Morph_fat-legs-lower" influence="0.000000" />
   <morph_modifier name="fat-legs-upper" internal_name="Morph_fat-legs-upper" influence="0.000000" />
   <morph_modifier name="muscular-arms-lower" internal_name="Morph_muscular-arms-lower" influence="0.000000" />
   <morph_modifier name="muscular-arms-upper" internal_name="Morph_muscular-arms-upper" influence="0.000000" />
   <morph_modifier name="muscular-body-lower" internal_name="Morph_muscular-body-lower" influence="0.000000" />
   <morph_modifier name="muscular-body-upper" internal_name="Morph_muscular-body-upper" influence="0.000000" />
   <morph_modifier name="muscular-legs-lower" internal_name="Morph_muscular-legs-lower" influence="0.000000" />
   <morph_modifier name="muscular-legs-upper" internal_name="Morph_muscular-legs-upper" influence="0.000000" />
   <morph_modifier name="thin-arms-lower" internal_name="Morph_thin-arms-lower" influence="0.000000" />
   <morph_modifier name="thin-arms-upper" internal_name="Morph_thin-arms-upper" influence="0.000000" />
   <morph_modifier name="thin-body-lower" internal_name="Morph_thin-body-lower" influence="0.000000" />
   <morph_modifier name="thin-body-upper" internal_name="Morph_thin-body-upper" influence="0.000000" />
   <morph_modifier name="thin-legs-lower" internal_name="Morph_thin-legs-lower" influence="0.000000" />
   <morph_modifier name="thin-legs-upper" internal_name="Morph_thin-legs-upper" influence="0.000000" />
   <animation name="AWAY" id="fd037134-85d4-f241-72c6-4f42164fedee" internal_name="Stand" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <animation name="CROUCHWALK" id="47f5f6fb-22e5-ae44-f871-73aaaf4a6022" internal_name="Crouch" looped="true" usevelocity="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.400000" />
   <animation name="FLY" id="aec4610c-757f-bc4e-c092-c6e9caf18daf" internal_name="Fly" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.100000" />
   <animation name="HOVER" id="4ae8016b-31b9-03bb-c401-b1ea941db41d" internal_name="Hover" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="0.350000" />
   <animation name="HOVER_DOWN" id="20f063ea-8306-2562-0b07-5c853b37b31e" internal_name="Hover" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="0.350000" />
   <animation name="HOVER_UP" id="62c5de58-cb33-5743-3d07-9e4cd4352864" internal_name="Hover" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="0.350000" />
   <animation name="RUN" id="05ddbff8-aaa9-92a1-2b74-8fe77a29b445" internal_name="Run" looped="true" usevelocity="true" fadein="0.250000" fadeout="0.250000" speedfactor="0.600000" />
   <animation name="SIT" id="1a5fe8ac-a804-8a5d-7cbd-56bd83184568" internal_name="SitOnObject" fadein="0.400000" fadeout="0.500000" speedfactor="1.000000" />
   <animation name="SIT_FEMALE" id="b1709c8d-ecd3-54a1-4f28-d55ac0840782" internal_name="SitOnObject" fadein="0.400000" fadeout="0.500000" speedfactor="1.000000" />
   <animation name="SIT_GENERIC" id="245f3c54-f1c0-bf2e-811f-46d8eeb386e7" internal_name="SitOnObject" fadein="0.400000" fadeout="0.500000" speedfactor="1.000000" />
   <animation name="SIT_GROUND" id="1c7600d6-661f-b87b-efe2-d7421eb93c86" internal_name="SitOnGround1" fadein="0.400000" fadeout="0.500000" speedfactor="1.000000" />
   <animation name="SIT_GROUND_CONSTRAINED" id="1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e" internal_name="SitOnGround1" fadein="0.400000" fadeout="0.500000" speedfactor="1.000000" />
   <animation name="SIT_TO_STAND" id="a8dee56f-2eae-9e7a-05a2-6fb92b97e21e" internal_name="SitOnGround1" fadein="0.400000" fadeout="0.500000" speedfactor="1.000000" />
   <animation name="STAND" id="2408fe9e-df1d-1d7d-f4ff-1384fa7b350f" internal_name="Stand" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <animation name="STAND_1" id="15468e00-3400-bb66-cecc-646d7c14458e" internal_name="Stand" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <animation name="STAND_2" id="370f3a20-6ca6-9971-848c-9a01bc42ae3c" internal_name="Stand" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <animation name="STAND_3" id="42b46214-4b44-79ae-deb8-0df61424ff4b" internal_name="Stand" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <animation name="STAND_4" id="f22fed8b-a5ed-2c93-64d5-bdd8b93c889f" internal_name="Stand" looped="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <animation name="WALK" id="6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0" internal_name="Walk" looped="true" usevelocity="true" fadein="0.250000" fadeout="0.250000" speedfactor="1.000000" />
   <master_modifier name="Arms twist" position="0.000000" category="Posture">
       <target_modifier type="dynamic_animation" name="Arm_Twist1" mode="cumulative" />
   </master_modifier>
   <master_modifier name="Body mass" position="0.500000" category="Body">
       <target_modifier type="morph" name="thin-legs-lower" mode="cumulative">
           <position_mapping master="0.000000" target="1.000000" />
           <position_mapping master="0.500000" target="0.000000" />
       </target_modifier>
       <target_modifier type="morph" name="thin-legs-upper" mode="cumulative">
           <position_mapping master="0.000000" target="1.000000" />
           <position_mapping master="0.500000" target="0.000000" />
       </target_modifier>
       <target_modifier type="morph" name="thin-arms-lower" mode="cumulative">
           <position_mapping master="0.000000" target="1.000000" />
           <position_mapping master="0.500000" target="0.000000" />
       </target_modifier>
       <target_modifier type="morph" name="thin-arms-upper" mode="cumulative">
           <position_mapping master="0.000000" target="1.000000" />
           <position_mapping master="0.500000" target="0.000000" />
       </target_modifier>
       <target_modifier type="morph" name="thin-body-lower" mode="cumulative">
           <position_mapping master="0.000000" target="1.000000" />
           <position_mapping master="0.500000" target="0.000000" />
       </target_modifier>
       <target_modifier type="morph" name="thin-body-upper" mode="cumulative">
           <position_mapping master="0.000000" target="1.000000" />
           <position_mapping master="0.500000" target="0.000000" />
       </target_modifier>
       <target_modifier type="morph" name="fat-arms-lower" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="1.000000" />
       </target_modifier>
       <target_modifier type="morph" name="fat-arms-upper" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="1.000000" />
       </target_modifier>
       <target_modifier type="morph" name="fat-legs-lower" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="1.000000" />
       </target_modifier>
       <target_modifier type="morph" name="fat-legs-upper" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="1.000000" />
       </target_modifier>
       <target_modifier type="morph" name="fat-body-lower" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="0.800000" />
       </target_modifier>
       <target_modifier type="morph" name="fat-body-upper" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="1.000000" />
       </target_modifier>
       <target_modifier type="dynamic_animation" name="Widen_Clavicles1" mode="cumulative">
           <position_mapping master="0.500000" target="0.000000" />
           <position_mapping master="1.000000" target="0.800000" />
       </target_modifier>
   </master_modifier>
   <master_modifier name="Body muscles" position="0.000000" category="Body">
       <target_modifier type="morph" name="muscular-arms-lower" mode="cumulative" />
       <target_modifier type="morph" name="muscular-arms-upper" mode="cumulative" />
       <target_modifier type="morph" name="muscular-legs-lower" mode="cumulative" />
       <target_modifier type="morph" name="muscular-legs-upper" mode="cumulative" />
       <target_modifier type="morph" name="muscular-body-lower" mode="cumulative" />
       <target_modifier type="morph" name="muscular-body-upper" mode="cumulative" />
       <target_modifier type="dynamic_animation" name="Widen_Clavicles1" mode="cumulative">
           <position_mapping master="0.300000" target="0.000000" />
           <position_mapping master="1.000000" target="0.500000" />
       </target_modifier>
   </master_modifier>
   <master_modifier name="Height" position="0.500000" category="Body">
       <target_modifier type="dynamic_animation" name="Height_Adjust1" mode="cumulative" />
   </master_modifier>
   <master_modifier name="Leg twist" position="0.000000" category="Posture">
       <target_modifier type="dynamic_animation" name="Leg_Twist1" mode="cumulative" />
   </master_modifier>
   <master_modifier name="Spine back/forward" position="0.500000" category="Posture">
       <target_modifier type="dynamic_animation" name="Spine_Posture1" mode="cumulative" />
   </master_modifier>
   <property name="MovementSpeed" value="1" />
   <property name="basebone" value="Bip01_R_Toe0" />
   <property name="basemesh" value="Jack.mesh" />
   <property name="baseoffset" value="0 -0.03 0" />
   <property name="headbone" value="Bip01_Head" />
   <property name="neckbone" value="Bip01_Spine2" />
   <property name="rootbone" value="Bip01" />
   <property name="torsobone" value="Bip01_Spine1" />
</avatar>

Proposal

image:Proposal_avatarappearance.png

Proposal is that instead of simulator fetching the avatar URI, World Service would provide one inside the enable_client message. Identity provider would have provided that to World Service with other attributes.

The second change is that instead of wrapping the asset in XML, it would be returned as raw binary, like normal web request.

The "generic xml" might also need to be changed. Exact details are now bit unknown.

Summary of Requirements

  1. Means to specify inventory where the avatar appearance can be found
  2. Means to specify an arbitrary set of custom attributes that are the parameters given by the avatar generator