Character Generation Pipeline
Pipeline for generating multi-agent community grounded in the scene
Import Mixamo Characters as Virtual Community Avatars
Step 1: Download FBX model from Mixamo
Click download, select FBX Binary (.fbx) and T-pose.
Step 2: Process FBX model with Blender
-
Import FBX into Blender
File -> Import -> FBX (.fbx), select one file at a time. -
Merge meshes if needed
Select all meshes in the outliner, right-click in the 3D Viewport, then clickJoin.
(Skip if only one mesh) -
Decimate the merged mesh
Select the joined mesh, add aDecimatemodifier, and set collapse ratio to0.15~0.2to reduce face count to ~4k–6k.
Step 3: Export GLB model with Blender
-
Export GLB file
File -> Export -> glTF 2.0 (.glb/.gltf)- Unselect:
Transform -> +Y up - Select:
Geometry -> Apply Modifiers - Unselect:
Animation -> AnimationandShape Keys
- Unselect:
-
Reduce texture resolution using gltf-transform:
gltf-transform resize --width 1024 --height 1024 mixamo_Chad_merge.glb mixamo_Chad_merge.glb
Problem Shooting
A-1. Vertice joint > total joints
IndexError: index 194 is out of bounds for axis 0 with size 65
Solution: Open and re-save the GLB file with a 3D viewer like Gestaltor.
A-2. Mismatch between skin and motion joints
Solution: When downloading motion FBX on Mixamo, select a standard human character like Jackie or Michelle.
Load Avatars in Genesis
Parameters:
-
motion_data_path: Path to motion.pkl -
skin_options:glb_path,euler,pos
-
ego_view_options: Optionalres,fov,GUI
-
frame_ratio: Frame update ratio -
terrain_height_path: Optional auto-height support
Actions
Move forward
move(distance[, speed=1])
Turn left
turn_left(angle[, turn_frame_limit=15])
Turn right
turn_right(angle[, turn_frame_limit=15])
Reach (Touch, Press)
reach(hand, object)
Pick
pick(hand, object)
Put
put(hand[, position, rotation])
Throw
throw(hand[, orientation])
Open
open(hand, object)
Close
close(hand, object)
Sit
sit([object, position])
Stand up
stand_up()
Drink
drink(hand)
Eat
eat(hand)
Play
play(hand, duration)
Enter/Exit Vehicles
enter_bus(bus)exit_bus()enter_bike(hand_id, bike)exit_bike(hand_id)enter_car(hand_id, car)exit_car(hand_id)
Other Functions
-
reset(global_trans, global_rot) -
spare(): Return True if avatar is idlefrom ViCo.modules.avatar.utils import ActionStatus
-
get_global_xy() -
get_global_height() -
get_global_pose(): Returns[x, y, z, r, p, y] -
set_global_height(height) -
render_ego_view(rotation_offset, depth, segmentation)
Adding Your Own Motions
-
Download motion FBX into:
Genesis/genesis/assets/motions/ -
Convert to pickle:
python convert_fbx.py -e Genesis/genesis/assets/motions/ -o Genesis/genesis/assets/motions/ -
Add your module under:
Genesis/genesis/assets/avartars/motions
Generate Scene-grounded Community of Characters
Prepare the OPENAI GPT-4o API key and create
.api_keys.jsonunder the root directory. Then, copy the following into.api_keys.json:{ "all": [ { "AZURE_ENDPOINT": "YOUR ENDPOINT HERE", "OPENAI_API_KEY": "YOUR KEY HERE" } ] }- Open
scripts/generate_characters_all.shand modify the scene(s) you want to generate characters, for example, if you want to generate characters for LONDON:SCENES=(LONDON) - Run
bash scripts/generate_characters_all.shto start generation process
Reminders
The script supports annotating multiple scenes at once, for example, SCENES=(LONDON TORONTO), but we recommend annotating one scene at a time.
Procedure Overview
There are 2 steps in the character generation pipeline. We provide an overview of main sub-steps of each step. Please refer to the source code for full sub-steps.
Step 1: Generate characters and annotate images of known places
- Generate config-level place/building metadata
- Sample Mixamo and celebrity characters from the pool
- Generate character profiles and groups information with grounding validator
- Annotate known places on the global image, which generates
known_places.png