The drift problem.
Ask an image generator for “the same character, now surprised” and you get back a cousin. The ears move. The palette shifts. The line weight changes. Close enough that my kids recognized him, too different to drop into the game.
I was asking the model to remember a character it drew one image ago. It can’t. Every generation starts from a blank slate, so identity dies at the image boundary.
Generate what varies inside a single image, and the model has to solve identity and variation together.
Move the variation inward.
So instead of asking for six expressions across six generations, I ask for one strip: the same rider six times over, only the face changing. The model can’t drift from a character that is sitting right there in the same composition.
BETTER: 1 CHARACTER × 6 MOODS × 1 GENERATION
The combinatorial payoff.
Once one strip comes back consistent, you can start splitting what changes from what stays put. Bodies became one layer, faces another, accessories and effects ride on top. Somewhere in there I stopped generating riders and started assembling them.
16 bodies + 10 reusable face parts = hundreds of combinations
What game-ready actually takes.
- A clean removable background, or true alpha.
- The anchor point stays in the same place on every sprite canvas.
- All expression variation generated inside the same composition.
- Procedural geometry stays in code instead of getting baked into the art.
- Drop the extracted sprite into the actual game before generating the next batch.
The larger rule.
This started as a sprite problem, but I keep reaching for it everywhere. When a system can’t stay consistent across repeated calls, I stop asking it to remember and move the whole set of variations into one shared context. Let it solve everything at once, then cut the result apart.