SMERESKI
  1. PROJECTS
  2. SKILLS
  3. RESUME
  4. BLOG
  5. GAMES
  6. CONTACT

POST · 2026-10-05

2026-10-05 · 8 MIN READ

Fifty-six models faced backwards

Most of the AI-generated 3D models my pipeline had stalled on were built exactly as asked. A rotation setting Blender silently ignored had left them facing the wrong way, a review script that found the word 'boar' inside 'keyboard' misjudged what some of them were, and nobody had looked at the rest again.

gamesgodotai-agentsverification
A lineup of AI-generated Spaceframe characters and animals, all facing the camera after the fix: a sheep, a deer, soldiers in a T-pose and a rider on a horse.
AI-assisted text — drafted with Claude from my session logs and code, then reviewed by me before publishingAI-generated 3D models — every model in this post was generated by Tripo; Claude Code agents wrote the prompts, reviewed, cleaned and rigged the results under my coordinationAI narration — synthetic voice (Kokoro), not a human recording
AI narration — synthetic voice (Kokoro), not a human recording · listen, or click any word to play from there

At 5:23 on Monday morning an agent looked at three renders of a hangar terminal and called it a failure. The prompt had asked for a chunky curved CRT screen with green phosphor text, tape reels and a keyboard shelf. The renders showed an olive-green box on a black pedestal with two yellow handles and nothing at all on its face. The agent wrote it up as the wrong subject, planned redos for it and three other pieces of crew gear that looked as far off, and put the cost at 135 to 180 credits. Then it stopped, because the browser tab it needed looked busy, and asked what to do.

Spaceframe is the survival game I have been building in Godot since July, and that weekend I had agents fill it with 3D models from Tripo, a text-to-3D generator: era buildings, soldiers and villagers, vehicles and their wrecks, trees, ruins, the gear a player's crew carries. Claude Code agents did the model work, dispatched by one coordinating Claude agent, and drove Tripo's web studio through my logged-in browser tab. I set the rules. The firmest is that agents only modify Tripo's meshes: they clean, rotate and rig, and never model a replacement themselves. If Tripo cannot produce something, it comes back to me.

Every model runs the same line. The prompt goes into the studio, at about 45 credits a textured generation; credits are Tripo's unit of usage on my plan. A review script measures the download against shape rules for its kind of object and renders it from three sides, and the agent reads the renders against a checklist built from the prompt. A bad roll gets the studio's free re-roll first and only then a paid rewrite, with a hard cap per model. Passing models are cleaned headlessly in Blender, which includes turning each one to face the game's forward direction. Humanoids are rigged separately, in Tripo's studio, with a skeleton and animation clips. Nothing reaches the game without passing the probe gate I described in Nothing merges on its own word.

The first failures, on Sunday evening, were real, and the prompts caused most of them. A cavalry rider came back as a standing soldier with no horse, because the prompt never mentioned a horse. A peasant spearman prompted with "NO plate armour" wore plate shoulder guards, and naming the material, a quilted cloth jacket, worked where the negation had not. The agent that turned those lessons into a reusable skill noticed one more thing: all five failures showed their backs in the front render. It blamed the cleaning script's rotation setting, which defaulted to zero, and the fix looked free. The default became 180 degrees, and a background job re-cleaned 49 models with it over the next hour. No one rendered a single one afterwards to confirm it.

The rigging run went through the night. Three bosses had been rigged earlier in the evening; now thirteen more humanoid characters and the cavalry rider, a separate model from its horse under a rule I had set that day, got a skeleton and idle, walk and attack clips, plus a riding clip for the rider. The agent drove the studio by clicking through the page, and some of its Generate clicks never registered, so clips had to be made again or came back duplicated. At the end of its report it noted that cleaning the same spearman with the rotation at 0, 90 and 180 degrees gave identical renders, and every rigged character still faced away from the camera.

A separate agent took the facing problem alone and found it in one line of the cleaning script. Tripo's download is a glTF file, glTF stores an object's rotation as a quaternion, and Blender's importer leaves the object in quaternion rotation mode. The script set the object's Euler angles. In quaternion mode Blender keeps those angles and ignores them, with no warning. The setting had never rotated anything, and the re-clean the night before had changed nothing at all. The fix was to switch the object to Euler mode before rotating it. That trap was already in my own notes from July, written when a Blender animation tool exported zero clips for the same reason, and I never carried it over to the cleaning script.

With the cause known, the agent rendered every model cleaned so far from the front and counted.

Which way 126 cleaned models faced
Facing forward, as intended70
Backwards or sideways56

Every model cleaned up to that point, rendered from the front once the cause was known. Humanoids, buildings, tanks and trucks faced backwards; the deer, horses, bikes and scout cars had arrived sideways.

Fifty-six of the 126, the static batch from that evening included, faced the wrong way. Twenty of the 21 humanoids showed their backs and eight buildings had their doors on the back wall; the deer, horses, rover, motorbikes and scout cars, among others, sat sideways and needed a quarter turn rather than a half. The agent re-cleaned the ones it was sure of from their raw downloads, 13 of them with a quarter turn, and each still loaded cleanly in the import check. A few it could not judge from one view, and left for a closer look; the crew-gear terminal was not re-cleaned with the fixed script that night. The rigged downloads were a different case: they never go through the cleaning script, because it rebuilds the mesh a skeleton is bound to. For those 17 files, the bosses included, the agent rotated the root node instead, skeleton and all, and the skins and clips came through untouched. One game-side patch had to go too. Qwen, a local model working on the animals, had added a table of hand-set turns for the deer, sheep and horse to make up for the backwards meshes, and with the meshes fixed the table would have turned them wrong again, so it was set to zero.

The first agent to stall after that was sent to make four toy-house pieces. At 4:03 it found the browser tab sitting on the rider's animation panel, last used almost four hours earlier, and stopped to ask whether another job still held it. Once told to go ahead, it hit a real limit of Tripo's: a floor section prompted as wafer-thin came back 1.6 metres thick, twice. Instead of building a floor itself, the agent added two options to the cleaning script, lay a panel flat and squash its height, and applied them to Tripo's mesh.

Fixing the script had not fixed the verdicts. The overnight batch of static models had been reviewed before the fix, and nobody had taken its verdicts again; at 5:21 my coordinator's log still listed the crew gear as failed or needing an eye, to be redone later. That was the list the terminal's reviewer started from two minutes after, and it stalled the same way, on a floor plank's export dialog left open in the tab. The skill told agents to stop if another job held the tab, and gave them no way to tell a live job from a leftover. Now it does: the tab is busy only if the attempt log has an entry from the last ten minutes or a generation is visibly running.

When the agent resumed, it re-cleaned the terminal from Tripo's original download with the fixed script. The front render now showed a curved screen of green phosphor text, a keyboard shelf and a tape reel. Tripo had built what was asked, and the screen had been on the side facing away from the camera.

The terminal had also failed before any agent looked at it. The review script guessed each model's kind from words in its name and prompt, then applied that kind's shape rules. The two backpacks were described as a soldier's field radio backpack and a soldier's heavy ammo backpack, and any mention of a soldier meant humanoid, which produced false failures for both. The terminal's prompt asked for a keyboard shelf, and "keyboard" contains "boar". Judged as a four-legged animal, a box 1.5 metres tall broke the rule that animals are longer than they are tall, and the script failed it on pose. The script now takes a declared kind first, then the model's name, and no longer looks for animal names inside prompts. Re-reviewed as props and facing forward, the twelve crew-gear models came out like this.

The 12 crew-gear models, after the re-review
Passed once an agent read the renders7 · 0 credits
Passed after a re-clean facing forward4 · 0 credits
Passed after two free re-rolls1 · 0 credits
Needed a paid rewrite0

The re-rolled model was the light machine gun. It passed review, but still lacked the ammunition belt its prompt asked for, and the next batch replaced it.

Four of the twelve passed on the re-clean alone, three of them models that had been marked failed outright. Seven had never failed; they had been waiting for someone to read their renders. The light machine gun took two free re-rolls. Against the 135 to 180 credits planned at 5:23, that morning's crew-gear run cost nothing. An hour later the rest of the batch came back from the same treatment, re-clean, re-review and a reading of the renders, with 36 more models passing.

The rest of the batch: how 36 models reached a pass
Re-clean and re-review only31 · 0 credits
Free re-roll1 · 0 credits
Paid retries from the night before3 · already paid
New paid rewrite (the machine gun's belt)1 · 45 credits

The machine gun appears here and among the crew gear; the belt-fed version is the one that ships. The three earlier retries, two bushes and a mech wreck, were paid for during the overnight rigging run and are counted there.

Thirty-one of those 36 needed nothing new from Tripo. The only new spend was deliberate. The machine gun had passed, but without the belt-fed ammo box its prompt asked for, and two free re-rolls had not produced one, so a rewrite led with the belt: a boxy ammo box and a visible chain of brass cartridges looping into the feed port. It worked on the first try. Three misses were Tripo's, or my prompts'. Two bushes kept coming out as small trees with trunks and a mech wreck as barely damaged, so the originals stay failed and what ships are their paid retries from the night before, which passed. A hound wreck stood upright until a free re-roll gave it a collapsed pose.

Counting the machine gun once, that is 47 models that had been failed or left waiting. Forty-two needed no new generation, two needed a free re-roll, and three had been genuine misses, already retried. The 45 credits were the only new spend on any of them. The weekend's run totals put that number in proportion.

Tripo credits spent, by run
Overnight rigging run (incl. 3 retries and the rider)1,935
Of that, lost to dropped Generate clicksabout 160
Four toy-house pieces225
Crew-gear re-review (12 models)0
Rest-of-batch re-review (36 models)45

Run totals are the account balance read before and after each run; the dropped-click figure is the rigging agent's own estimate. The toy pieces include one paid retry after a free re-roll hung.

The big bill was work that needed generating: skeletons and clips for fourteen characters. The toy-house pieces were deliberate spend too, including one paid retry after a free re-roll hung. The rest of our own mistakes were cheap only by luck. The dropped clicks alone cost about 160 credits, more than three times the 45 that all 47 stalled models needed, and the facing and word-matching bugs cost nothing to undo because someone finally re-ran a script on files already on disk, at about a minute of Blender per model.

Some limits. This is one weekend, one generator and one game. Every pass verdict here was an agent reading renders, the quarter-turned models still need my eye, and how any of it looks in play is my playtest, which has not happened yet.

What I own is the gap between Sunday evening and Monday morning. A fix went in on the strength of a guess, a background job applied it to 49 models, and nobody rendered one of them to see that it had changed nothing until the rigging agent tripped over it hours later. I had even written the cause down in July. Even after the real fix, the verdicts made on backwards models stood until Monday morning, and the plan to spend up to 180 credits re-generating some of them was stopped by a stale browser tab, not by any check of mine. The check that cleared them was the cheapest one available: re-run the cleanup and the review on the files already downloaded. It should come before the first credit is spent on a new one.

REFERENCES5 LINKS
  • 01
    Nothing merges on its own word

    The probe gate every one of these models passed through on the way into the game, and the rule that no agent's own report counts as proof.

    /blog/nothing-merges-on-its-own-word

  • 02
    The harness was the slow part

    The same lesson from a different direction: a model looked bad until I measured what the surrounding setup was doing to it.

    /blog/the-harness-was-the-slow-part

  • 03
    Blender Python API: Object.rotation_mode

    Where the rotation mode lives; an object in quaternion mode does not use its Euler angles, which is the whole bug.

    https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.rotation_mode

  • 04
    glTF 2.0 specification: transformations

    Why the imported object was in quaternion mode to begin with: glTF stores a node's rotation as a unit quaternion.

    https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#transformations

  • 05
    Tripo

    The text-to-3D generator that made every model here, used through its web studio with free re-rolls before any paid retry.

    https://www.tripo3d.ai