(a) 3D base model · Quaternius RobotExpressive (CC0), in-browser
VTT token: 3/4 top-down render, clipped round, class-coloured ring
On a 5-ft grid square (1.52 m), model scaled to 1.8 m
What it takes
- One rigged base mesh per body type (Quaternius/Kenney CC0 packs, or Mixamo-rigged); animations are shared across rigs only if the skeletons match.
- Class = material colour swap here; real variety needs swappable parts (helmets, weapons on hand bones, armour meshes) or a modular kit.
- Tokens and portraits are free and instant once the mesh exists; the look is "game asset", not "art". Expression only as rich as the morph targets (3 here).
(b) AI image portrait · mocked, no API called
Prompt built from character data
API (hosted)OpenAI
images.generate, model gpt-image-1, 1024×1024, quality low / medium / high
Cost, roughlyabout $0.01 / $0.04 / $0.17 per square image at low / medium / high (my recollection; verify current prices)
AlternativesFlux (schnell / dev) or SDXL hosted per image (roughly $0.003–0.03 each, verify); or local SDXL/Flux in ComfyUI on a GPU box (no per-image fee, needs ~8–24 GB VRAM; this server has no GPU)
Thenstore PNG in storage, crop a round token from the face for the VTT
Request that would be sent
Portrait placeholderNo image model is configured on this machine and other projects' keys must not be used, so nothing was generated.The 1024×1024 result would appear here.
What it takes
- One API key and a queued job; best-looking route for character portraits by far.
- Consistency is the problem: the same character looks different each time. Keep the seed/reference image and pass the first portrait back as a reference for later images (edits endpoint / IP-Adapter).
- Moderation and licence terms of the provider apply to outputs; cost scales with every regenerate click, so cap it per user.
(c) 3D pose → image model · control images made here, result mocked
Pose and camera of (a) are the composition. Pause and re-grab:
beauty render (img2img init)
depth (MeshDepthMaterial)
normals (MeshNormalMaterial)
edges (Sobel on normals+depth, in JS)
Payload a ControlNet / img2img call would take
Result placeholderAn SDXL/Flux + ControlNet (depth + canny) run would return the character drawn in the chosen style, in exactly this pose.
What it takes
- ControlNet needs an open model: ComfyUI on a GPU (own or rented) or a hosted ComfyUI/Replicate workflow; gpt-image-1 only takes the render as a loose reference image, not a strict control.
- Gives what (a) and (b) lack alone: art quality with controlled pose, framing and scale, repeatable per character.
- Most moving parts: base rig, render step, workflow JSON, GPU. Worth it only if many consistent poses per character are wanted.