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.
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.
The fifth animal. Dragon years: 2000, 2012, 2024, 2036. The Dragon could fly, yet it came fifth: it stopped to bring rain to a village in drought, then blew the Rabbit’s log to the shore. Unlike a Western dragon, it has no wings: it flies on its long, snake-like body. In its claw it holds a glowing pearl, which stands for wisdom and good fortune.
The sixth animal. Snake years: 2001, 2013, 2025, 2037. The Snake hid coiled round the Horse’s hoof and crossed the river unseen. At the finish it darted out, the Horse reared in fright, and the Snake slipped in ahead of it.
The seventh animal. Horse years: 2002, 2014, 2026, 2038. The Horse was galloping for the finish when the Snake darted out from its hoof and it reared in fright. It stands for energy and freedom. The emoji is a racehorse, so it wears a green saddle cloth.
The eighth animal. Goat years: 2003, 2015, 2027, 2039. The Goat, the Monkey and the Rooster crossed the river together: the Rooster found a raft, and the Goat and the Monkey cleared the weeds and pushed it across. The Chinese 羊 means goat or sheep, so some call this the year of the Sheep; Vietnam keeps the Goat.
The tenth animal. Rooster years: 2005, 2017, 2029, 2041. The Rooster found the raft that carried it, the Goat and the Monkey across the river. The emoji is a white rooster, like a Leghorn, so it wears only red: the comb, the face and the wattles.
The eleventh animal. Dog years: 2006, 2018, 2030, 2042. The Dog was the best swimmer of all, yet came eleventh: the water was so clear that it stopped to play. Its upright ears and the tail curled over its back are those of a spitz breed, such as the Shiba Inu.
The twelfth and last animal. Pig years: 2007, 2019, 2031, 2043. The Pig stopped on the way to eat, fell asleep, and woke to finish last. In Japan, the twelfth animal is the wild boar.
The second animal. Ox years: 1997, 2009, 2021, 2033. The Ox knew it was slow, so it set off for the race before dawn, and it would have won had the Rat not ridden on its back. The Ox stands for hard, patient work. In Vietnam, the Buffalo takes its place: the water buffalo that ploughs the rice fields.
The third animal. Tiger years: 1998, 2010, 2022, 2034. Look at its forehead: the stripes there form 王, the Chinese character for king. Chinese folklore reads it as the mark of the king of the beasts.
The fourth animal. Rabbit years: 1999, 2011, 2023, 2035. The Rabbit can’t swim, so it hopped across the river on stepping stones and finished the last stretch on a floating log. In Vietnam, the Cat takes its place. Chinese folklore also puts a white rabbit on the Moon, where it pounds the elixir of life with a pestle.
The ninth animal. Monkey years: 2004, 2016, 2028, 2040. The Monkey helped push the raft across, then came ninth. Chinese folklore’s best-known monkey is Sun Wukong, the Monkey King of Journey to the West, who leaps across the clouds and rebels against heaven itself.
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
- 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.
- 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.
- 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.
- 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. - 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:
- Run the whole script inside Blender (about 2 seconds).
- Look from fixed angles: three-quarter, side, and a close-up of the face.
- 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.
- 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.