Drive this engine live: open the Live VRM 3D seat on the Test Bench →

3D / VRM

live-vrm Heavy — wants a real GPU

A real 3D body with a living 2D face painted onto it — the whole figure walks, sits, gestures and speaks, and its face is drawn by the same engine that runs the flat avatars.

WebGL through three.js and the VRM humanoid standard. The face is a 1024×1024 canvas, painted by the Hybrid engine, swapped in as the head material's texture.

What it can express

Moods: two systems at once — six body moods retinting posture and gesture, and the full 25-mood face engine painting the head. The only engine here where body and face carry emotion separately.

What it costs a device

measured on this box375×6671440×900
cold mount → first frame1,445 ms2,192 ms
rAF fps — idle21
rAF fps — speaking1.71.3
CPU cores busy — idle6.205.31
CPU cores busy — speaking5.495.74
worst frame gap (p95)883 ms1,350 ms
over the wire9.71 MB9.71 MB
JS heap51 MB51 MB

Two orders of magnitude past every 2D engine, and the only one that cannot hold frames at all: 1–2 fps with worst-case gaps approaching 1.4 seconds, burning 5–6 CPU cores. This is SwiftShader doing on 18 server cores what a GPU is meant to do — a real GPU changes this number more than any other on these six cards, so read it as "needs a GPU", not as "2 fps on your phone". The 9.71 MB is one of the SMALLEST models on disk; the rack runs to 148 MB.

Why heavy: A full 3D scene with skinned humanoid bones, rendered here with no GPU at all. This is the one engine whose class is decided by the hardware rather than by the code — give it a GPU and it moves; withhold one and it cannot hold a frame.

Dials it really exposes today

110 configuration fieldsthe live config door, in 12 categoriespresence 39 · body.motion 15 · body.hands 14 · initiative 12 · device 10 · persona 7 · character 4 · backdrop 3 · identity 2 · standing 2 · model 1 · share 1
model rackwhich VRM body is worndrop your own .vrm, or pick from the built-in rack
the five-number face joinwhere the live face sits on the 3D head — the same five numbers a 2D Hybrid face usescx · eyeY · spread · mouthY · scale
zones / pal / ink pass-throughthe whole 2D face dial rack reaches the 3D face unchangedsame sanitized vocabulary as Hybrid
?clear=1swaps the opaque paper backdrop for a transparent canvas, for compositing over a pagedefault is opaque paper
hosted or self-loadingbind to a VRM the host page already renders, or let the mount load and render one itselfopts.vrm/opts.scene, or opts.payload/opts.src

Try it

The VRM Stage — drop a model and drive itgated · walt pass/alive-site/demo/wire-sw/vrm/ The config door — all 110 dialsgated · walt pass/alive-site/demo/wire-sw/config/ The wire figure — the rig contract, ungatedopen/alive-site/demo/wire-sw/body.html

Honest limits

Numbers are software-renderer numbers. Measured 2026-08-04 on the estate box (18 vCPU, load 2.8–5.3 during the run) under chromium_headless_shell-1232 + SwiftShader, 3 runs per cell, median reported. SwiftShader rasterizes on the CPU, so a real phone GPU changes the picture — most of all for 3D. Read the ordering between engines, not the absolute figures. Evidence for every claim: CARD-FACTS.md. Harness: work/measure-engines.mjs.