Birdoggydog's Builds

Prototyping bodies in a browser viewer and a Blender pool

Two ways to see a body change in seconds, a Three.js viewer that reshapes the skin and a Blender kit kept open, and what each one got wrong.

Judging a new body shape used to take about 196 seconds, because the only way to see one was to build, rig and clip it in Blender. Now I can see six variations on all six races in under 3 seconds in a browser, or build them by the real kit in about 8.5 seconds per body. Nothing is installed in the game yet. This was about finding a look I like, and I haven’t picked one.

I gave an agent a document of my own notes on modeling and told it to run until it hit the standards in it. The goal was faster, more consistent, better results, measured by three new clocks: time to a viable test render, time to a viable test model, and time to a finished game asset. I also said not to follow the document blindly, so for the first rounds two agents ran side by side. One built the document’s idea, a Three.js viewer. The other made the Blender pipeline fast. Both rendered the same pictures and I compared the clocks.

A grid of six columns and six rows of gray figures, one row per race from human to lizard, each column a slightly different shoulder and trunk shape, with a thin orange outline of the original body behind each one.

Six shoulder variations on every race, front view, with the body as installed drawn as an orange line. The whole batch took 2.7 seconds.

How does the browser viewer work?

It’s a Vite page with Three.js and Tweakpane. It loads the six installed bodies and their gear, and a headless Chromium script renders sheets, up to six browsers in parallel. One batch of 6 variations on 6 races in 3 views is 108 pictures in 2.2 to 4.4 seconds. The same settings give the same PNG, byte for byte.

The reshaping is a morph made on load from the skin’s weights. Joints move, the skin grows around the bones, the feet stay on the floor, and the clips keep playing on the new shape. There are 18 controls by now, covering shoulder width, a deltoid and a yoke, chest depth, torso, arm and leg length and girth, neck length and girth, head size and stoop. A save writes the numbers out in the format the Blender kit’s body code reads.

The viewer also marks problems on a dressed figure. Red means plate is under the skin, yellow means one piece goes through another, and blue means a point stands more than 35 mm off the body. Before any change, the plate scored 13 out of 30 and the cloth 17.

The morph has limits. It can’t take the breasts off the dwarf and orc, because pushing the chest depth to 0.9 moved the front by under 2 cm. It also can’t add mass where there is none. Those had to be the kit’s job.

What did the Blender pool change?

The second agent kept six Blender processes open so a batch doesn’t pay for six starts. A body with a picture and two walk frames takes 8.2 to 8.7 seconds. The same six pictures take 7.4 seconds with a warm pool and 23.6 cold, and they came out pixel-identical built four different ways. A real build of one dwarf, with rig, clips, check and export, takes about 130 seconds against 196.

The pipeline’s slow parts were also timed, step by step. One worn piece costs about 155 seconds, of which 122 is the clip check, because a piece can’t be sealed alone. Its fit is found in every outfit it is worn in.

The agent added five switches to the kit’s body code. They are deltoid, yoke, neck_girth, pec (a flat plate in place of the chest mass that looked like breasts on the dwarf and orc) and hunch. Each does nothing when unset, and I had a test hash all six bodies to prove it, so the installed bodies don’t change.

Six rows of figures, one per race, each shown from the front, three-quarter, side and back and then two frames of a walk, all in gray light.

The Blender track’s best of round 2, the six bodies built by the kit, from four sides and two frames of the walk.

Why did the lizard look like it was falling apart?

The viewer’s “stoop” curls the upper spine and keeps the pelvis upright. The kit’s stoop leans the whole trunk from the hips. So the goblin at 22 and the lizard at 30 came out bent double when the kit built them, and scored 9 out of 20. The new hunch switch matches the viewer, and the same numbers scored 16.

The floating lizard head had two causes. In the kit it never floated. The side view had cut the head off, and I fixed the framing. In the viewer it was a real fault. The neck was stretched up the world’s vertical axis while the head went along the neck’s line, so a forward-set neck left the head 28 to 45 mm ahead of its top. The neck now grows along its own line.

Six rows of figures from the side with the lizard at the bottom, bent forward at the waist with its head thrust out in front, the orange outline of the upright original behind it.

The lizard from the side, five variations against the installed body in orange. Hunch 30 on the third column scored best.

What did I decide about the shapes?

I answered a few questions on my review page. Bodies come first, then plate, in gray studio light, with fewer and larger views. On shoulders I said I hate the heroic look but was open otherwise, so the agents dropped the sloped yoke and picked by score. The lizard gets a hunch, and the dwarf is a barrel on short legs. Every race but the lizard gets a short thick neck. The Blender track’s best scored 47 out of 60 against 27 for the body as built. It has a taper, a deltoid, the flat chest plate and legs 10 percent shorter on the dwarf.

Can plate follow the new body?

The game scales a rigid piece of plate to the box of its slot, so it doesn’t follow a reshaped body. On the dwarf, the cuirass stood out like a flange. In the viewer, fit.follow moves each point of a piece the way the skin under it moved, and fit.hug from 0 to 1 pulls in anything standing more than 6 mm off.

The numbers are for the dwarf’s worst stand-off: 126 mm as installed, 162 scaled to the new body, 128 following the skin, 74 at hug 0.5, 52 at 0.75 and 38 at 1. Hug 1 has no flange, but its dents follow the lumps of the skin, so I think 0.75 is the balance. It’s only in the viewer for now.

Two blocks of figures wearing gray plate armor over bare skin, each in four columns, with red, yellow and blue dots marking where the plate clips or stands off.

Plate on the bare dwarf, human, orc and lizard: scaled to the slot as the game does, following the skin, hugging at 0.5 and hugging at 1.

Did the two tracks become one pipeline?

I didn’t want two tracks running forever. I’d said the goal was to find the fastest pipeline, and my plan was to iterate in the viewer and hand the result to Blender after that. That has landed as one command with a stage for each step: make a batch, lay the sheets, dress the gear, choose, and hand off. The viewer is the loop. The kit builds once, at the hand-off of a chosen look, behind a parity gate. Both engines read one vocabulary of numbers, and a name that isn’t in it is an error.

The clocks: 6 variations on 6 races in 3 views, laid as sheets, take 3.8 seconds. Measuring 24 dressed figures takes 3.0 seconds. A chosen look goes to kit pictures and through the gate in 17 seconds. A real study build is 76 to 86 seconds a frame, down from 125 to 132.

The gate lays each engine’s outline over its own picture of the frame as built and scores the overlap from the front and the side. A race is flagged under 0.85, and the frame as built scores 0.95 to 0.98.

Three pairs of columns of bare gray-pink figures in three views, the viewer's picture and the kit's picture side by side. The dwarf is a broad barrel with a thick chest, and the text under it says it was flagged.

The hand-off sheet for human, elf and dwarf: the viewer’s body beside the kit’s, front, three-quarter and side, with the gate’s scores under each pair.

The gate found two things wrong in the kit, and both are fixed. Its height was the crown of the head, so a shorter neck made a longer trunk. And its hunch was a shear that pushed the back forward without bending it, so now it bends at the waist and chest. The six installed bodies still export the same bytes.

Round 1 on the new pipeline hunched the goblin 22 and the lizard 30, with a shorter neck and smaller head on the lizard. Human, elf, orc, goblin and lizard passed at the round 2 look. The dwarf was flagged, because the kit’s flat chest plate and belly are things the viewer can’t show. The hunched goblin and lizard were flagged too: under a hunch the kit’s arms turn with the chest and the viewer’s hang straight down. Which one is right is a question still open, with straight down as the default.

Heads and hands are next, then armour. The time to a finished game asset isn’t measured by either track yet.