Skip to content

Rebuild the character from lofted geometry - #8

Merged
ralyodio merged 1 commit into
mainfrom
feat/character-rebuild
Jul 26, 2026
Merged

Rebuild the character from lofted geometry#8
ralyodio merged 1 commit into
mainfrom
feat/character-rebuild

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The character was stacked axis-aligned cubes and read as a Minecraft figure. No amount of texturing fixes a silhouette made of blocks.

It is now lofted_lib.loft/limb/ring bridge cross-sections whose radius changes along their length, so the torso has a waist and limbs taper. Hard-surface gear is layered on top, with subdivision applied only to the body (a smoothed plate carrier looks inflated rather than rigid).

The art direction does real work here: a helmeted, visored operative in heavy gear is almost entirely hard surface, which is what a script is good at. Faces, skin and bare hands are what procedural generation genuinely can't do well — and this design shows none of them. Deliberate, not a dodge.

Gear: helmet with brow, visor, side rails, NVG mount, ear cups; plate carrier with shoulder yoke and cummerbund; magazine pouches, radio, admin pouch; pauldrons; belt, holster, dump pouch; knee pads, gloves, boots; backpack. 6.3k triangles.

Two iterations on proportion, both caught by rendering it:

  • Pauldrons lofted with straight sides and capped ends rendered as blobs floating beside the body → now taper at both ends and blend into the arm.
  • That first tapered version was 19×25 cm and swallowed the arms → now 13×18 cm.

preview.py gains --front. Props are authored facing +Y and the camera suited them, so a character (facing −Y) was being reviewed from behind.

Also stops tracking __pycache__, which an earlier git add -A swept in.


Still outstanding, and the bigger gap: there is no animation system, so the character doesn't move. A rig and animation cycles are the next step — that matters more for "feels alive" than any further mesh work.

201 tests pass. Format, lint clean.

🤖 Generated with Claude Code

The character was stacked axis-aligned cubes and read as a Minecraft figure.
No amount of texturing fixes a silhouette made of blocks.

It is now lofted: `_lib.loft`/`limb`/`ring` bridge cross-sections whose radius
changes along their length, so the torso has a waist and limbs taper, with
hard-surface gear layered on top and subdivision applied only to the body — a
smoothed plate carrier looks inflated rather than rigid.

The art direction is doing real work. A helmeted, visored operative in heavy
gear is almost entirely hard surface, which is what a script is good at; faces,
skin and bare hands are what procedural generation cannot do well, and this
design shows none of them. That is a deliberate choice rather than a dodge.

Gear: helmet with brow, visor, side rails, NVG mount and ear cups; plate
carrier with shoulder yoke and cummerbund; magazine pouches, radio, admin
pouch; pauldrons; belt, holster, dump pouch; knee pads, gloves, boots;
backpack. 6.3k triangles.

Two iterations went into proportion. Pauldrons lofted with straight sides and
capped ends rendered as blobs floating beside the body, so they now taper at
both ends and blend into the arm; the first tapered version was 19x25 cm and
swallowed the arms entirely, so they are 13x18 cm.

preview.py gains --front. Props are authored facing +Y and the camera was
placed to suit them, so a character — which faces -Y — was being reviewed from
behind.

Also stops tracking __pycache__, which an earlier `git add -A` swept in.

Still outstanding and the bigger gap: there is no animation system, so the
character does not move. A rig and animation cycles are the next step.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

@ralyodio
ralyodio merged commit 6c6dcec into main Jul 26, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant