Placeholder art — not final

BlueCaptain Placeholder — Blender Setup Guide

Placeholder art Not final

How to generate and install the procedural test character used for rigging and animation-import testing before final character art exists.

What this is

A Blender script that procedurally builds the BlueCaptain placeholder character — a chibi-proportioned figure out of primitives, with a 19-bone armature, 73 meshes, and fifteen posed copies laid out to match the ArtBible action-pose sheet. No manual modelling and no weight painting: every mesh is bone-parented, so it is posable the moment it finishes.

It exists so gameplay, animation and equipment-swap testing can proceed in Godot while the final stylised art is produced separately. It is intentionally simple and will be replaced.

Three scripts, and you only run one.

FileRole
generate_bluecaptain_placeholder.py Run this one. Builds everything.
bluecaptain_proportions.py Imported. Every size, landmark, colour and material. Edit this to tune the body.
bluecaptain_poses.py Imported. The fifteen action poses. Edit this to tune a pose.

All three must sit in the same folder. If the script cannot find its siblings it says so and lists every directory it tried; set SCRIPTS_DIR at the top of the main script as a last resort.

Body and equipment are separate, which is the important structural decision. The body collection holds skin, hair, face and jersey — a complete character wearing no gear. The BlueCaptain_Equipment collection holds the helmet, gloves, skates and stick as overlay items. Hide it and model replacements in place; the body underneath is untouched. That split is also what Chapter 31's equipment system assumes.

Where the shapes come from

Nothing here is invented. Every proportion and material is read off the ArtBible:

SheetWhat it supplies
001 players / 001 Blue Captain Male.png The 8-direction turnaround the proportions are measured from, the fifteen action poses, the 10-swatch colour palette, and the nine named materials (helmet plastic, jersey fabric, pads rubber, gloves leather, skates hard plastic, stick carbon, blade tape, metal steel, ice). Also the authority on no face cage and on the cyan eyes.
002 player_equipment / 009 Helmets.png Exploded construction: shell, vent ports, front plate, visor/cage, side plates, liner, padding, ear covers, chin cup, chin strap, buckle.
002 player_equipment / 012 Gloves.png Exploded construction: finger padding, knuckle armour, top shell, side plates, thumb guard, palm padding, wrist guard, cuff, strap and buckle.

The character sheet beats the category sheet. The generic helmet page shows cages on most designs; the Blue Captain does not have one, so cages sit behind BUILD_FACE_CAGE (off) for a later equipment variant.

Colours, materials and the palette atlas

Two things that are often conflated, and the ArtBible separates them, so this does too.

Materials are roughness and metallic, not just tint. Helmet plastic is glossy (roughness 0.18), jersey fabric is matte (0.88), skate blades are the only truly metallic part (metallic 1.0). Those numbers come from the material callouts on the three sheets above and live in MATERIAL_PROPERTIES. It is most of what makes a primitive read as gear.

The palette atlas is a single small image of flat colour swatches, with every mesh UV-mapped to the centre of its own swatch. The whole character then needs one material and one texture — cheap, and it imports into Godot without fuss. Re-colouring later means editing a 16-pixel image rather than thirty materials. Region names follow the mask sets the ArtBible specifies (primary, secondary, two accents, decals, metal, rubber), so the placeholder and the finished art describe the same regions.

Set USE_PALETTE_ATLAS = False to keep one material per part instead, which is easier to tweak inside Blender. Both are kept; the flag chooses.

Checking it without Blender

This is the part worth understanding, because the first version of this script shipped broken and could not have been caught here: the development environment has neither Blender nor Python. The geometry cannot be run; the arithmetic can.

So the numbers live in pure-Python modules with no bpy import, and Node verifiers parse and check them:

CommandChecks
node art/Blender/Scripts/verify_proportions.js Landmarks ascend from ice to crown, the head is a chibi third of total height, the helmet does not swallow the face, the eyes sit low and wide, features descend eyes → nose → mouth, hair clears the brows.
node art/Blender/Scripts/verify_poses.js Fifteen poses in a 5×3 grid, every posed bone exists, no rotation beyond ±180°, poses that go to the ice lower the root, asymmetric poses really are asymmetric.

The posed-bone check earns its place: Blender silently ignores a pose bone name it does not recognise. A typo does not raise — the pose simply does not apply, which looks exactly like the script being broken.

The generator also measures itself at run time and prints every part's real bounding box through the depsgraph (so Subsurf shrink is included), with pass/fail lines for total height, head width, heads-tall and "lowest point sits on the ice". Read that report — it is the substitute for a test.

Requirements

ToolVersionNotes
Blender4.0 or newerUses the modern edit_bones / primitive_*_add API; older 3.x Blender may work but is untested.
Godot4.7Must have a Blender install path configured under Editor Settings → Filesystem → Import → Blender → Blender Path for direct .blend import to work. If this project previously imported .blend files, it's likely already set.

Running the script

  1. Open Blender. A new/empty file is fine — the script only ever creates or replaces objects it names itself (everything prefixed BlueCaptain_, plus the BlueCaptain_Rig armature), so it won't disturb anything else in the file.
  2. Switch to the Scripting workspace tab along the top of the Blender window.
  3. In the script editor's text area, click Open (folder icon in the header) and browse to:
    art/Blender/Scripts/generate_bluecaptain_placeholder.py
  4. Click the Run Script button (▶) in the script editor header, or place your cursor in the text area and press Alt + P.
  5. The script builds the full character + rig, then tries to save the result directly to:
    art/Blender/Characters/BlueCaptain/CH_BlueCaptain_BaseBody_v001.blend
    That exact filename matters — it's the path Godot's asset pipeline expects for this character. If the auto-save fails (check the System Console / status bar for a message), use File → Save As and save to that exact path yourself.

Verifying it in Godot

Switch to Godot, let it reimport, and check the FileSystem dock under art/Blender/Characters/BlueCaptain/ for the new .blend. Drag it into a test scene, or temporarily swap it in under PlayerModel in scenes/player_main.tscn to preview it against the current gameplay collision capsule.

Adjusting proportions

Near the top of the script, two constants control the overall look without touching any of the body-building logic:

HEIGHT_SCALE = 1.0   # uniform resize of the whole character
HEAD_RATIO   = 0.34  # head diameter as a fraction of total height (higher = more chibi)

Change either, re-run the script (Alt+P again), and it rebuilds from scratch with the new numbers.

Re-running / iterating

The script is idempotent — every run first deletes any previously-generated BlueCaptain_* objects and the BlueCaptain_Rig armature before rebuilding, so re-running it after a tweak never leaves duplicates behind.

Evolution of the model

Six runs in one evening, kept because the failures are more instructive than the result. Every one of them was caused by something invisible in the code and obvious in a screenshot — which is the whole argument for rendering early and often on a script that cannot be tested where it is written. This environment has neither Blender nor Python, so every one of these was found by the user running it and sending a picture back.

Source images live in art/ArtBible/001 players/base_player/, alongside the concept sheet they are chasing. They are a long way off it, and that gap is the point of keeping them.

Run 1 — A scatter of parts
Run 1 A scatter of parts

Not a proportions problem: parent_type = "BONE" offsets a child by the bone's TAIL, and matrix_parent_inverse compensates only for the armature object's transform. Every mesh flew out along its own bone's vector and the displacement accumulated up the chain. The head was never oversized — it was on the highest bone, so it flew furthest and landed nearest the camera.

Run 2 — Assembled, and far too cubey
Run 2 Assembled, and far too cubey

The parenting fix landed and the figure came together. Two problems remained: the proportions were a realistic 1.65 m human rather than the reference's ~2.9-head chibi, and every rounded shape kept its corners. The cause was counterintuitive — MORE subdivision cuts make a Subsurf cube BOXIER, because each cut adds edge loops that pin the flat faces.

Run 3 — Round, and completely grey
Run 3 Round, and completely grey

Zero cuts with a higher Subsurf level gave genuine roundness. But the new palette atlas was CLEARING each part's material and assigning a single atlas material whose viewport colour was never set — so Solid shading drew the whole character flat grey. The atlas was meant to be additive; it had been made destructive.

Run 4 — Colour back, face arrives
Run 4 Colour back, face arrives

Materials restored and the first real face: eyes, brows, nose, mouth, plus hair instead of a helmet on the base body. The helmet became overlay equipment in its own collection. Still wrong: the hair read as a plank laid across the skull, and a white slab sat across the mouth.

Run 5 — The white slab explained
Run 5 The white slab explained

That slab was the helmet's CHIN CUP, placed at chin height on the front of the head — exactly where the mouth is — so it covered the mouth in helmet-trim white. The eyes were two blank pale almonds because the iris was both larger than the pupil and further forward, burying it.

Run 6 — Where it stands
Run 6 Where it stands

Chin cup moved under the jaw, hair and fringe rounded and lowered, and the eye stack rebuilt so each layer sits proud of the last: white, cyan iris, dark pupil, catch light. Feet turned the right way round — -Y is the front, and the skates had been offset backwards. Clear coat and a three-point light rig make the gloss read.

The pattern across all six: not one was a modelling problem. Every single failure was a wiring problem — a parent type, a subdivision count, a material assignment, a part placed at the wrong landmark, an offset with the wrong sign. That is worth remembering the next time something looks like it needs artistic judgement.

The target

Blue Captain concept sheet

The ArtBible sheet every number in bluecaptain_proportions.py is measured from: the 8-direction turnaround, the fifteen action poses, the 10-swatch palette, and the nine named materials. It is also the authority on two things the generic equipment sheets get wrong for this character — no face cage, and cyan eyes.

Known limitations

Troubleshooting

SymptomLikely cause
Script errors on an unknown operatorBlender version is older than 4.0 — update Blender.
Godot shows a broken/missing mesh referenceThe saved .blend isn't at the exact expected path/filename above — re-save to that location.
Nothing appears to happen when runningCheck the Blender System Console (Window → Toggle System Console, Windows only) for the printed save-path confirmation or error.