Hologram skins

Every player wears a hologram skin from head to toe. Skins come in categories, and everyone starts as a bunny. This page works out how to build the bunny: its body, rig, motion and shading.

Bunnies

The pictures come from the bunny study. s8-1 leads, with two loose fur streaks removed, and s4-0 and s1-1 redraw j6-0 at e11-3's adult size.

A big cream plush bunny with tall pink-lined ears holds a black rifle pointing left, above small pink and white cosmos. A thin mint rim runs round its outline, with red and cyan fringes, and the meadow curves up behind it.
s8-1, the lead picture.
The bunny stands tall and close among cosmos, holding the rifle across its chest in two mitten paws; faint scanlines cross its body.
s4-0j6-0 in e11-3's pose
Seen from down in the flowers, the bunny strides toward us with one foot raised, showing pink pads on its sole.
s1-1j6-0 seen from the flowers
A smaller plush bunny with the rifle, ears and loose fur streaming sideways in the wind, petals flying.
j6-0The plush and the wind
A tall photographic plush bunny seen from low in lilac flowers, holding a rifle pointing left under a blue sky.
e11-3The size

Reading the bunny

The build keeps five things from the pictures:

  • A mascot's shape. Its round head is about a third of the body, and the ears, pink inside, add about as much again. The body is pear-shaped, the arms end in round mittens with no fingers, and each big foot has four pink toe pads and a heel pad that show when it lifts. The game's cosmos stand 20–42 cm tall, so they reach a 1.9 m bunny's knees.
  • Three marks for a face. Two black dots set wide and low, a tiny nose and mouth, and big round blush on the cheeks make the face. With no brows or lids, feeling comes from the ears and the pose.
  • Plush at the edge, flat inside. The outline breaks into soft tufts. Inside, the fur is two flat tones of cream, green on the shaded side.
  • The hologram shows at the edges: a mint rim just outside the outline, thin red and cyan fringes and faint scanlines, with no black ink line anywhere. The rifle is the pictures' classic black rifle (carry handle, A-frame front sight, slotted handguard, curved magazine), a little chunkier and rounder than the real one, in two tones with a cool shade and a bright glint. As a projection too, it has the same rim and fringe, and it is the gun you hold in first person, with the skyshell launcher under its handguard.
  • Wind. Ears and loose fur stream behind, and petals fly.
Close-up of the bunny's face: two black dot eyes, a tiny nose and mouth, round coral blush with scanlines across it, and a mint rim with red and cyan fringes along the head.
Dots, blush, and scanlines across the cheeks
Close-up of two round cream mitten paws gripping the black rifle, with no fingers.
Mittens on the grip
Close-up of a raised foot showing four small pink toe pads and one large heel pad, the fur tufted at the edge.
Pads under the foot, tufts at the edge
Close-up of the ears blown sideways, with long streaks of loose fur and petals trailing behind.
Ears and fur in the wind

Body and size

The hologram is mapped onto the player's body, so the bunny always faces and poses exactly as the person inside. Two things follow:

  • One skeleton for every skin. A skin only adds loose parts to the person's skeleton, for the bunny the ears and tail, so any animation works on any skin.
  • One hitbox for every skin. The body is a capsule 1.9 m tall and 1 m across, and anything above 1.55 m counts as the head. The bunny's head reaches about 1.9 m and its ears about 2.4 m, and the ears take no damage. Players' tests show that Fortnite also gives every skin one hitbox. Since the bunny's ears show over cover, every category gets the same limit, nothing more than half a metre above the head, which is as far as the ears go, so no skin hides better than another.

Mesh and rig

There are three ways to get a bunny into three.js:

WayHowGoodCosts
Blobs in codeHead, body, ears, mittens and feet are soft blobs, each tied to a bone, merged into one mesh when the game loads. The arms are a second piece sewn on at the shoulder, so they turn without dragging the chest.No files, a few hundred lines. The skin weights come from the blobs, and the proportions are numbers to tune.Round shapes only, which is all the bunny has. Later categories may need modelled meshes.
Modelled in BlenderA mesh with its skeleton and weights, saved as glTF and loaded by three.js.Any shape, full control.Needs a modeller. Weights are painted by hand, and every change goes back through Blender.
Generated from a pictureTripo, Meshy or Hunyuan3D turn a picture into a mesh. Tripo and Meshy also rig it.A first mesh in minutes, from a front view with the arms out, which Nano Banana can draw.Lumpy fur in the geometry and uneven normals, which cel shading shows plainly. Licences need checking.

The bunny is built from blobs.

Normals make the cel look

Guilty Gear Xrd's lead character modeller: "The smallest inconsistency in normals result in a super evident artifact under Cel-shading." Xrd keeps its shading in vertex normals and colours, without textures, because they stay clean in close-ups. Blobs give clean normals: the head's point out from the centre of the head blob, so the head shades as one ball with no break at the cheeks or the neck, and the shader draws the face from the same direction, so it stays crisp at any distance without a texture.

Bones

The body needs 17 bones: the hips, two for the spine, the neck, the head, and three for each arm and leg. The bunny adds three for each ear and one for the tail, 24 in all. Xrd uses about 500 per character, because its animators pose every feature by hand for fighting-game close-ups; ours are seen from a few metres at the closest, and code moves them.

How it moves

Overgrowth got fluid motion from little animation work by blending a handful of key poses in code, according to what the body is doing (David Rosen, GDC 2014). Our bodies already know their speed, aim, footing and which way is up, so the bunny's motion is computed from those and the server sends nothing extra.

  • Running on a distance clock. Each foot moves in a loop. While planted, it moves back under the body at the body's speed, so it stays still on the ground; then it lifts heel first and swings forward. The loop advances with distance covered, so the feet never slide. Standing, jumping and landing blend in by speed and height, and the plush squashes on landing and stretches on take-off, keeping its volume.
  • Aim you can read. The chest and arms turn the gun to where the player looks, so others see where you aim, and the muzzle they see is where the shot leaves.
  • Shots and hits on top. Recoil kicks the arms, and a hit makes the body flinch.
  • Ears on springs. Each ear is a chain of three bones that trails the head, pulled by gravity, the body's swings and the wind. VRM avatars use the same spring bones (stiffness, gravity, drag), and three-vrm runs them in three.js, though thirty lines of our own would do. Each player has their own "down" under skin gravity, so the ears hang right anywhere on the shell, and in a flip they trail behind, showing which way you rolled.
  • Feet on the ground. Each foot reaches for the ground with two-bone IK, for the shell's curve now and for slopes later.
  • Poses on twos. Guilty Gear Xrd stopped interpolating between keys, because in-betweens "look more 3D", and Spider-Verse animated Miles on twos, a new pose every second frame of 24, to feel "sticky and staccato". Other players' poses can likewise change 12 times a second while their bodies glide every frame; your own paws stay smooth. This needs a test, because stepped poses might make fast strafes harder to track.
  • Less with distance. Far bunnies update their poses less often and stop their ear springs.

Shading

  • Plush cel. Two tones of cream with a soft edge, the light wrapping a little past halfway so the plush reads as soft. The shaded side takes the ground's colour from the painter's ground map, green on the meadow and cream on a path, as on s8-1. Characters keep their own light, as Xrd's do (The look, Keeping players readable).
  • Tufts at the edge. Xrd draws its outlines as an inverted hull: a copy of the mesh pushed out along its normals, with only its back faces drawn. Noise breaks our hull into clumps, so the outline comes out tufted for one extra draw. Where the hull crosses the body, such as an arm over the belly, it draws a soft tan line in place of the rim, and the arms and rifle shade the body under them. Up close and on your own paws, 8 to 12 shells add real fluff: copies of the mesh stacked slightly further out, each drawing a slice of the hairs, as most game fur is drawn (Lengyel and others, 2001). Beyond about 10 m the tufted hull is enough.
  • The hologram. The hull is drawn in mint, a little brighter than white, so the light pass makes it glow into the rim. Faint scanlines drift across the body. Skins and guns mark their pixels as they draw, and the light pass splits red and blue only on marked pixels, so only projections get a fringe, as on the wave, and it widens with speed.
  • Hits and deaths. A hit shifts slices of the body sideways for a frame or two and widens the fringe. A shot through the ears ripples the rim. On death the hologram breaks into scanlines and goes out.
  • At range. The rim stays a pixel or two wide on screen, so a bunny 100 m away is still a cream mark with a mint edge on the green. In squads, the rim's colour can mark the team.

Bunny lab

A first bunny, built the way this page proposes, with a switch for each choice so bots can wear whichever wins.

Building the bunny…

Path
Gait
Poses
Ears
Light
Normals
Edge
Fur
Scanlines
Glow
Rim
Rifle

24 bones– triangles– drawsmesh built in –– fps

Drag to turn the camera. 30 m and 100 m use the game's 78° view, and fur shells draw only at 4 m and in first person (Eye). Light and normals change every bunny at once; the other switches are per bunny.

Things to judge:

  • The gait at 10 m/s, the game's running speed: Run, Hop or Waddle.
  • Ones, twos and threes, up close and at 30 m.
  • The ears in the wind, in a flip and while strafing.
  • The edge at 100 m: ink against mint, and whether the tufts still read.

The plan

StepWhatStatus
Bunny labThe bunny in code, with each take a switch (above).built
Bunnies for botsEvery bot wears the lab's bunny with the mint rim in place of the capsules (Skin in the pause menu). It holds the rifle with its body turned across it, so the rifle points where it aims, and looks at its target. A soft shade under its feet falls on ground, grass and rooftops and shrinks as it jumps.built
Paws in first personBig plush arms on the rifle, chunky on purpose and made from blobs: the right mitten on the grip with a stub on the trigger, the left pumping the launcher's grip. The arms don't have to match the bunny seen from outside, so the left forearm lies along the gun's underside, tucked under the launcher and the magazine, and arm and gun read as one mass in any pose. The paws use the bunny's shading, lit from above with a warm shade under each round part. Paws in the pause menu turns them off; fur shells are still to come.built
The dash as a boundA dash (Shift) on the ground is one long hop: a push with the feet behind, a tucked flight, and the feet swinging forward to land. Its size comes from the dash's speed: about 7 m long and half a metre high at a run, and 4 m and 0.3 m from standing, as high as a real bound that long would rise under the game's gravity. In the air, the dash stretches the body.built
The hologram in the light passThe lab's fringe, scanlines and hit glitch, on bunnies only. Because bunnies mark their pixels as they draw, walls and grass in front of them stay clean.built
TestsPoses on twos against smooth ones, ears over cover, and readability at 50 and 100 m.proposed

The lab's bunny is about 39,000 triangles, skinned on the graphics card. Its ten fur shells and two rim passes draw the mesh twelve more times, about 500,000 triangles in all, so shells only draw up close. The blobs' sampling grid sets the triangle count, so bots wear three versions: the full mesh above 320 pixels tall on screen, about 17,000 triangles down to 110 pixels, and about 7,600 below that, with no shells. A bunny off screen isn't posed or drawn. The Frame readout in the pause menu will give real numbers.

Sources

"Secondary" marks press reports and third parties; the rest come from the developers or authors.

Games

  • Guilty Gear Xrd, Junya Motomura, "GuiltyGearXrd's Art Style: The X Factor Between 2D and 3D", GDC 2015: transcript and slides
  • Overgrowth, David Rosen, "An Indie Approach to Procedural Animation", GDC 2014: GDC Vault
  • Fortnite, one hitbox for every skin (secondary, players' tests): GGRecon

Animation

Fur

  • Lengyel, Praun, Finkelstein and Hoppe, "Real-Time Fur over Arbitrary Surfaces", I3D 2001: project page
  • NVIDIA, fur with shells and fins, 2007: PDF