Theme
← Home

The 12 zodiac animals in 3D

On this page

The lunar calendar gives each year one of twelve animals, in a fixed order that repeats every twelve years. A year starts at Lunar New Year, between 21 January and 20 February, so anyone born before that day, in January or early February, belongs to the year before. Legend says the Jade Emperor set the order with a race: the Rat rode across the river on the Ox’s back and jumped off at the finish to win.

Vietnam keeps the same cycle with two swaps: the Cat takes the Rabbit’s place, and the Buffalo stands in for the Ox.

The twelve

Pick an animal to see it in 3D.

Loading the model…

The first animal. Rat years: 1996, 2008, 2020, 2032. The legend goes on: the Rat promised to wake its friend the Cat for the race, then let it sleep. The Cat missed the race and has chased rats ever since. In Vietnam, where the Cat takes the Rabbit’s place, it got in after all. The Rat stands for wealth, so it holds an old cash coin: round, with a square hole.

How the animals are built

Nobody sculpts the animals by hand. Each one is a Python script of a few hundred lines that builds it in Blender, the free 3D suite, and rebuilds it from scratch in a few minutes at most. The script is the model: changing a stripe or an ear means editing a number and running it again. Every animal goes through the same steps, so the twelve share one style.

The pipeline

  1. Shape. The body is built from metaballs: blobs that melt into each other where they meet, like drops of water. A few big blobs make the torso and head, and chains of small ones make the legs. Blender turns them into one smooth skin. A long, coiled body, like the Snake’s, is instead a single tube bent along a curve, so its coils stay apart.
  2. Coat. The skin is unfolded onto a flat image, like peeling an orange flat. For each pixel, Blender records where on the body it lands and which way the surface faces there. Simple rules then paint every pixel: pale on the belly, darker on the back, then the markings, such as the Tiger’s stripes.
  3. Details. Each eye is a sphere sunk into the head, so only a cap shows. Thin parts, such as whiskers, horns and tails, are tubes bent along curves. Props are simple shapes: the Rat’s coin is a disc with a square hole.
  4. File. Blender exports a glTF binary (.glb), the standard 3D format for the web: one file holding the shape, the coat image and the materials. meshopt, a compression scheme for 3D geometry, keeps each animal under 500 KB; it shrinks the Tiger from about 810 KB to about 450 KB.
  5. Display. three.js, a JavaScript library for 3D in the browser, loads the file. It lights the model softly, casts one soft shadow onto an invisible floor, turns it slowly, and draws only while it is on screen.

The loop

I build each animal with an AI coding agent, which drives a live Blender through MCP, a standard way for an AI to use other apps. Each round goes the same way:

  1. Run the whole script inside Blender (about 2 seconds).
  2. Look from fixed angles: three-quarter, side, and a close-up of the face.
  3. Measure, don’t guess: fire rays at the model, like a laser rangefinder, to find the top of the head, the line of the belly, where the forehead starts. For the Ox, the same numbers came from the emoji’s outline, so the two profiles could be compared point by point.
  4. Change one thing, then go again.

Anything tried in Blender goes back into the script, so no model depends on a Blender session that has since closed.

Choices

Part Chose Over Because
Source A script Sculpting by hand Rebuilds in seconds; every change reads as text
Shape Metaballs Basic shapes glued together Parts melt into one body, no seams
Coat A painted image A colour on each point Colour blends between points, so stripes came out blurry
Eyes A sunk, painted sphere Separate spheres for eyeball, iris, pupil The pupils hid inside the iris
Compression meshopt Draco One file and an 8 KB decoder; Draco is ~60 KB smaller in all, but its decoder is separate files

Lessons

  • Compare outlines, not impressions. The first Ox looked stubby, but nobody could say why. Laying the emoji behind the model’s side view showed it at once: the chest sat too far back, and the rump sloped where the emoji’s is square.
  • Then walk all the way round. An emoji shows one side; the page shows every side. The Goat matched the emoji’s outline almost pixel for pixel, yet from the front its head was a thin wedge with eyes bulging like a fish’s, and from behind its tail was a flat paddle. The first Rooster’s eyes looked straight ahead like an insect’s, though a bird’s eyes sit on the sides of its head.
  • Let the computer fit the outline. Nudging blobs by hand, the Dog’s outline stalled at 88% overlap with the emoji’s. A short script that tried small changes to every blob, kept those that helped and tried again reached 97% in five minutes.
  • Measure before you move. The Tiger’s ears floated above its head, placed where the head was guessed to be. Measuring the real surface first put them on it.
  • Eyes make the face. Tilt the eyes the wrong way and the animal looks sad. Put the glints on opposite sides and it looks cross-eyed: both should catch the same light.
  • Judge colour where readers see it. Blender lights a model differently from the web page. The white Rabbit looked grey in Blender, and the green Dragon came out lime on the page.
  • Shade, don’t glow. The first Pig came out too dark on the page, so its skin was given a faint glow. It got brighter but flat, like plastic. Painting in the emoji’s warm, darker belly made it look solid again.
  • Keep each paint rule to one part of the body. A rule meant to paint the throat cream, “surfaces facing forward, below the neck”, also caught the front of the Tiger’s thighs.