Custom Models and Animations

Learn how to use custom VRM models and animations in your games.

Using Custom Character Models

By default, the SimpleCharacter component uses a built-in robot avatar. You can easily replace this with your own 3D model by providing a URL to the model file in any of the following formats:

  • VRM - The standardized VRM format for avatars requires no additional configuration
  • GLTF - (or also glb) Standard 3D Model format - make sure to use the standard vrm bone names as shown below
VRM 1.0 humanoid bone names (click to expand)

The following are the standard VRM 1.0 humanoid bone names your GLTF rig should use (aligned with the VRM specification). If your model uses these names, animations and retargeting will work reliably:

Bone nameDescription
hipsPelvis root; parent of the spine and both legs
spineLower/waist spine segment above hips
chestMid/upper torso segment above spine
upperChestOptional highest chest segment below neck
neckNeck base; parent of head
headHead root; parent of eyes and jaw
leftEyeLeft eyeball transform
rightEyeRight eyeball transform
jawJaw/mandible pivot
leftUpperLegLeft thigh (upper leg)
leftLowerLegLeft shin (lower leg)
leftFootLeft foot root/ankle
leftToesLeft toe base
rightUpperLegRight thigh (upper leg)
rightLowerLegRight shin (lower leg)
rightFootRight foot root/ankle
rightToesRight toe base
leftShoulderLeft clavicle/shoulder pivot
leftUpperArmLeft upper arm (humerus)
leftLowerArmLeft forearm
leftHandLeft hand/wrist root
rightShoulderRight clavicle/shoulder pivot
rightUpperArmRight upper arm (humerus)
rightLowerArmRight forearm
rightHandRight hand/wrist root
leftThumbMetacarpalLeft thumb metacarpal (root of thumb)
leftThumbProximalLeft thumb proximal phalanx
leftThumbDistalLeft thumb distal phalanx
leftIndexProximalLeft index proximal phalanx
leftIndexIntermediateLeft index intermediate phalanx
leftIndexDistalLeft index distal phalanx
leftMiddleProximalLeft middle proximal phalanx
leftMiddleIntermediateLeft middle intermediate phalanx
leftMiddleDistalLeft middle distal phalanx
leftRingProximalLeft ring proximal phalanx
leftRingIntermediateLeft ring intermediate phalanx
leftRingDistalLeft ring distal phalanx
leftLittleProximalLeft little/pinky proximal phalanx
leftLittleIntermediateLeft little/pinky intermediate phalanx
leftLittleDistalLeft little/pinky distal phalanx
rightThumbMetacarpalRight thumb metacarpal (root of thumb)
rightThumbProximalRight thumb proximal phalanx
rightThumbDistalRight thumb distal phalanx
rightIndexProximalRight index proximal phalanx
rightIndexIntermediateRight index intermediate phalanx
rightIndexDistalRight index distal phalanx
rightMiddleProximalRight middle proximal phalanx
rightMiddleIntermediateRight middle intermediate phalanx
rightMiddleDistalRight middle distal phalanx
rightRingProximalRight ring proximal phalanx
rightRingIntermediateRight ring intermediate phalanx
rightRingDistalRight ring distal phalanx
rightLittleProximalRight little/pinky proximal phalanx
rightLittleIntermediateRight little/pinky intermediate phalanx
rightLittleDistalRight little/pinky distal phalanx
import { SimpleCharacter } from '@react-three/viverse'

export function MyCharacter() {
  return <SimpleCharacter model={{ url: '/path/to/your-model.vrm' }} />
}

Adding Custom Animations

Your can replace the default animations of the SimpleCharacter component with files in any of these three supported animation formats:

  • VRMA (VRM Animation) - The native VRM animation format
  • FBX - Popular file format for character animations
  • GLTF - Standard 3D format with animations
  • Mixamo - deprecated - use remove type: 'mixamo' and add boneMap: mixamoBoneMap instead

Make sure to either use a bone map, e.g. when your bone names follow the mixamo naming conventions use the mixamoBoneMap or use the standard VRM bones for the animation amature as shown above under "VRM 1.0 humanoid bone names".

Each animation type can be configured individually:

<SimpleCharacter
  animation={{
    walk: {
      url: '/animations/walking.fbx',
      boneMap: mixamoBoneMap,
      removeXZMovement: true,
      scaleTime: 0.8,
    },
    run: {
      url: '/animations/running.vrma',
    },
    idle: {
      url: '/animations/idle.gltf',
      trimTime: { start: 0.5, end: 3.0 },
    },
  }}
/>

You can customize any of these animation slots:

  • walk - Walking animation
  • run - Running animation
  • idle - Standing idle animation
  • jumpStart - Beginning of jump
  • jumpUp - Ascending during jump
  • jumpLoop - Mid-air loop animation
  • jumpDown - Landing animation