1 Stage by stage
| Stage | Kenshi | Saints Row: The Third | The Sims |
|---|---|---|---|
| Engine | OGRE (forked: adds per-bone "bone size" and "positional size") | Volition's engine, DX11, inferred lighting | Maxis engine: prerendered objects, real-time 3D characters, SimAntics VM |
| Base mesh | One per race and gender. Head included. 15–17k vertices for humans | One per gender, both with the same 7977-vertex topology. Head included | None: separate head (~50–80 vertices) and body meshes, picked whole |
| Slider definitions | Editor XML per race: ranges, targets, mids, variation | player_creation.xtbl: 110 sliders in 12 sets, each with keys | No sliders. File-name patterns over every character file decide the options |
| Slider → shape | Weight = value × 0.01, one target (or an opposite pair) per slider | Piecewise ramps (Full / Nill / Neg) per key, possibly several targets per slider | A choice is a (mesh, texture) pair, saved as a text "body string" |
| When morphs apply | Baked once at spawn into a mesh copy. The poses are deleted | Accumulated on the CPU into a vertex-buffer copy, incrementally as sliders move | Never: no morphs. Meshes are skinned to a 29-bone skeleton each frame |
| Body proportions | Bone scales on a 30-bone Biped, plus posture via animation clips | Morph targets (fat, muscle, skinny, race), with no bone scaling | Baked into each body: fit, fat or skinny bodies; adult or child skeleton |
| Muscle and fat detail | Body normal map blends toward muscular or skinny with physique stats | Five normal maps blended per character into a render target | Modelled and painted into each body |
| Skin colour | A 1-D RGB ramp multiplied in the shader | An HSB shift of the base texture in a composite pass, then a matcap | Three hand-painted texture sets per head and body; no tinting |
| Face details | Swappable head texture (UV island added onto the body) | 2D layers composited into one texture: eyes, brows, beard, makeup, scars | Painted into the head texture, hair included |
| Hair | Attachment mesh sharing the skeleton. Face morphs don't reach it | An item with its own copy of the morph targets, so it follows the head | Part of the head mesh and texture |
| Clothing | Not part of character creation (inventory armour) | 572 items, 3 dyes each, with slot hiding, submesh hiding and flag-driven mesh swaps | Outfits are whole bodies: everyday, formal, swim, pyjamas, winter, high fashion; must match the build |
| NPCs | Same system as the player, seeded from a hash of a name | A separate system: authored body + base head + one morph, varied by palette and props | Same lists as the player, drawn uniformly at random; 314 premade characters |
| Randomness | MSVC rand(), reseeded per NPC face name (deterministic) | One engine-wide MT19937 table of 8192 values, clock-seeded | Two 32-bit LCGs: one reseeded from the clock per townie, one saved with the game |
| Races | 30 data-driven races, from humans to robots, on one skeleton | 4 race presets, each a morph target set to 1 | None; three skin tones and two ages split the catalogue |
2 Three philosophies
Kenshi: one system for a world
Kenshi needs hundreds of NPCs across 30 races, on an indie budget. Its answer is to make the character system purely data: a race is an XML file plus a mesh, and everyone, from the player to a cannibal to a Hive drone, goes through the same function. The expensive part (a baked mesh) is shared by name, so a whole town of generic Greenlanders needs only five face meshes per gender.
Bone scaling does most of the work: it's cheap and works across races without per-race art. The visible cost is NPC sameness. The face shape pool is tiny, and individuality comes from textures, hair and skin.
Saints Row: one doll for a player
Saints Row's character is the product. The system is built so the player can wear anything at any shape: every garment and hair style ships with its own copy of the morph targets, so proportions carry through. Surface identity (tattoos, makeup, beards, eye colour) is never geometry. It's composited into a single texture, so 18 tattoo areas cost nothing at draw time.
NPCs are deliberately kept out of it. They're authored characters with a palette, which is cheap and art-directable, but no NPC is ever procedurally shaped.
The Sims: a catalogue anyone can extend
The Sims has no deformation at all. The exe builds its head and body lists by matching file names, so every option is a hand-made mesh and texture, and adding one is as easy as dropping files into a folder. That is what made its custom-content scene possible, and it let seven expansions add looks without touching code.
Player and NPC share the catalogue: townies, NPCs and grown-up babies just draw from it at random. The price is that nothing exists between the files, and skin tone splits the catalogue three ways.
3 Same problem, different answers
Making a body bigger
Scale bones. Chest scales Spine2 and pushes the
upper arms out through their positional size. Nothing needs re-authoring per race, but the result is
only ever a stretch of the base shape.
Blend sculpted targets (body fat +,
body muscle +), plus matching normal maps. That gives real fat and muscle silhouettes, but every
clothing mesh must carry those targets too, and items cost more to author.
Pick a different body. Build (fit, fat, skinny) is baked into each body mesh, and every outfit is authored once per build so it still fits.
Making faces different
17–27 morph targets per race, applied linearly, plus head, neck and jaw bone scales and four head textures. Integer sliders with wide ranges (−200…200) allow extreme results.
About 100 face sliders across 11 sets, finer-grained (separate crown, forehead, brow, ear, cheekbone and jaw regions), with keys that can drive opposite targets and scale weights by up to ×2.
Scroll through whole heads: 84–137 per adult gender and skin tone, each a 50–80-vertex mesh with the face and hair painted on.
Colour
Skin is a 1-D ramp (6 stops for Greenlanders), so you can only move along one line of colours. Hair is free HSB.
Skin is one of 55 HSB offsets, including blue, green and gold. Every layer takes one of 117 colours, and every item three of 126. Colour is the biggest source of combinatorial variety.
Skin is three texture sets (light, medium, dark), hand-painted per head and body. No tinting anywhere, so a head exists only in the tones it was painted in.
NPCs
Procedural, with the same generator as the player. Five shapes per race, gender and faction weirdness, deterministic across saves. Head texture, skin, hair and bones vary per NPC.
Authored. 223 types, each a fixed look. Per spawn, only the palette colours, props (submeshes switched by VID), head choice and hair tint vary.
The player's catalogue, drawn uniformly: a clock-seeded RNG picks gender, skin, body and head for townies. Babies inherit only skin tone, then draw a random child head and body.
4 How much variety
Orders of magnitude contributed by each category. Adding bars multiplies option counts. Hover for details. The table below has the same numbers.
What's on disk
The raw meshes and textures behind those numbers. Each game is split into what its creator offers and what only NPCs use. A file shared by both is counted once, under the creator. Texture sizes are the originals in the game's own formats (DDS, peg or BMP), not the demos' downscaled copies. Morphs are blend shapes stored with a mesh.
Kenshi's human body is stored as a plain triangle list (no shared vertices), so its vertex count is three times its triangle count. Kenshi clothing and armour are items, outside character creation, and aren't counted. Saints Row's NPC heads are one base mesh plus one head morph each. The Sims' "NPC only" row also covers pets and the premade characters' own suits. Counted by a script of ours that reads each game's files.
5 Strengths and weaknesses
Kenshi
Strengths
- One code path for the player and every NPC, so behaviour is consistent and easy to mod
- Races are pure data: 30 races, from humans to robots and insects, share one skeleton
- Bone scaling gives body proportions for free across every race and outfit
- Deterministic NPC faces (name hash) keep saves small and let meshes be shared
- Baked meshes cost nothing per frame
- Posture as an animation scrub is cheap and artist-friendly
Weaknesses
- Only 5 face shapes per race, gender and weirdness for generic NPCs
- Morphs don't update normals, so strong shapes are lit wrongly
- Hair and beard meshes ignore face morphs and can clip
- Bone scaling can only stretch, not reshape (no fat or muscle silhouettes)
- The skin is a single ramp, and some races have one stop
- Quirks: a truncated-hash mesh cache, robot races with dead face sliders, posture blending with idle anims
Saints Row: The Third
Strengths
- Everything follows the body: hair and all 572 items carry the morph targets
- Huge expressive range, especially in colour: 55 skins, 117-colour layers, 3 dyes per item
- The runtime composite makes unlimited makeup and tattoos cost one texture and one draw
- Blended normal maps sell body type without extra geometry
- Flags and VID hiding solve clipping (hat hair, sleeves, hoods) in data
- Creator UI logic is plain Lua over a small C API, so it's easy to follow
Weaknesses
- NPCs get none of it: no procedural NPC faces or bodies
- Content cost: male and female meshes, morph copies and textures per item (1151 meshes)
- CPU morph accumulation and a 2048×1024 composite target per customised character
- Matcap shading is stylised and view-dependent rather than physically lit
- Data slips ship: wrong VID lists, two hair textures with no real opacity
- Few race presets (4). Ethnicity is a single morph target
The Sims
Strengths
- Trivial to extend: a new head or body is three files with the right names
- Every option is hand-crafted, so nothing looks broken or uncanny
- Tiny runtime cost: ~50–80-vertex heads, one texture each, no morphs or composites
- Player and NPCs share one catalogue; townies and children need no extra art
- Choices save as readable text (body strings), easy to edit and debug
Weaknesses
- Nothing between options: no sliders, no tinting, no mixing
- Skin tone splits the catalogue (292 light heads against 200 dark), and children get a quarter of the heads
- Every outfit must be authored per build and skin tone
- Children don't resemble their parents beyond skin tone
- Clock-seeded townies made in a burst share a gender; the last name in each list never appears
6 What each system can't make
Kenshi can't…
- give a generic NPC a unique face shape (outside the five)
- make a fat or muscular silhouette, only scaled limbs
- give hair or a beard that follows a morphed jaw or skull
- colour skin outside the race's ramp
- dress a character at creation
Saints Row can't…
- make an NPC that isn't one of the 223 authored looks
- change height or limb length (there's no bone scaling)
- combine two items in one slot, or two layers in one composite slot
- vary NPC height (Variation is 0 everywhere)
- replay a randomised character (clock-seeded table)
The Sims can't…
- make any face or body that isn't a shipped (or downloaded) file
- offer a head in a skin tone it wasn't painted in
- pass a face or body shape from parent to child
- change hair separately from the head
- dress a body in an outfit made for another build
7 Lessons for building your own
- Separate shape, proportion and surface. Morph targets for shape, bone scales for proportion, composited textures for surface detail. Each scales differently, and Kenshi and Saints Row each use at least two of the three.
- Make everything that touches the body carry the body's morphs (Saints Row), or accept clipping and design around it (Kenshi's hair).
- Seed NPC generation from stable names (Kenshi) to get deterministic, shareable results. Put the individual variation in cheap channels: textures, colours, props.
- Composite surface detail into one texture (Saints Row). Layers cost nothing per frame and multiply variety enormously.
- Use bone scaling and morphs together. Kenshi's bones give height and limb length that Saints Row lacks. Saints Row's targets give silhouettes that Kenshi lacks.
- Recompute or blend normals. Kenshi shows the cost of not doing it, and Saints Row's normal-map blend shows a cheap fix.
- File names can be a data model (The Sims). Matching names against patterns made content packs and fan content free to add, with no tables to update.
- Don't seed from the clock per item. The Sims reseeds for every townie, so townies made within half a second share their first draw. Seed once and keep the stream.
- Validate data at build time. All three games ship slips (wrong paths, wrong VIDs, a stub race, broken opacity channels) that only a runtime fallback hides.