Starvard University · School of Technology

GTA 5 Style Characters for a Browser Game

How a small browser game got people who idle, walk, run, jump, wave and sit like a real third person game: the rig standard that came first, the six animation clips every character carries, the open avatar library that supplied the bodies, the tiny loader that swaps them into a running game, and the honest bill, in tokens and dollars, for having an AI do the heavy lifting. Every screenshot in this course is taken from the real game and its real character files.

Starvard University
Starvard University
GTA 5 Style Characters for a Browser Game · Starvard University
The three finished character models standing in a row: the player character in a blue sweater and khaki chinos, Sam in a cream knit and blue jeans, Harsh in a pink floral shirt, cream trousers and a straw hat

The whole course in brief

  1. GTA style is a camera and a verb list, not a polygon count: a camera behind and above the character, plus idle, walk, run, jump, sit and wave that blend into each other.
  2. Fix the skeleton before you touch a model: one 19 joint human rig, exact joint names, metres, Y up, facing forward, feet on the ground.
  3. Every character carries the same six clips in one file: Idle, Walking, Running, Jump, Waving, Sitting, all animated in place.
  4. We tried five routes to a good character. Four taught us something and failed; the fifth, restyling an open avatar library, shipped.
  5. The winning recipe: pick a Microsoft Rocketbox avatar (free, MIT licence), convert it to GLB, restyle the outfit, retarget the six clips, key the jump by hand, compress to about 350 KB.
  6. Identity lives in the face and the clothes. Protect the original faces, and let the mesh be a good actor wearing them.
  7. A 300 line loader module swaps the models in without the game noticing: lazy downloads, one private copy of the bones per character, and the old body stays as a permanent fallback.
  8. Models move two ways: motion clips for ordinary life, and pose copying for anything the game poses by hand, like sitting in a car or riding a train.
  9. Every character still has a body built entirely from code, animated by one sine wave. It is the understudy that never misses a performance.
  10. The asset bill for the shipped route was zero dollars. The AI bill depends on the model you pick: this course prices the same job on four Claude models, with the arithmetic shown.

The ten lessons

Lesson 1

The Result: What GTA Style Actually Means

When players say a browser game feels like Grand Theft Auto, they almost never mean the graphics budget. They mean a short list of behaviours. The camera floats behind the character and a little above, so you see your person in the world instead of seeing through their eyes. The character idles with a bit of life in them, walks, breaks into a run, jumps, sits down in vehicles and on benches, and waves at people. A minimap sits in the corner. The whole thing responds instantly, on a phone, in a browser tab, with no install.

That list is good news. It means the hard part is not modelling a movie quality human. The hard part is motion that blends: a walk that starts and stops without popping, a run that grows out of the walk, a jump that takes off and lands, a wave that rides on top of whatever the legs are doing. Get the motion system right and even a modest character reads as GTA style. Get it wrong and a beautiful model still moves like a shop mannequin.

This course is the full case study of one game that made that jump: E2 World, a free browser island game whose cast are real people. The three finished models are pictured at the top of this page: the player character in a blue sweater and khaki chinos, Sam in a cream knit and jeans, and Harsh in a pink floral shirt and a straw hat. They shipped in the game's V 0.13 release on November 13, 2026. Everything below is exactly how they were made, including the routes that failed first.

The game in play at night in the rain: the player character seen from behind in the GTA style camera, facing the Chateau in Tawny Square, minimap in the corner
The target feeling, live in the browser on a rainy night: third person camera behind the character, a lit town around them, place labels overhead, and the minimap in the corner. Play it here.
Play first, read second. Open the game, walk around for two minutes, and watch what your character does when you stop, sprint, jump and sit. That is the spec for everything in this course.

Lesson 2

Start With a Rig Standard, Not a Model

The single most valuable decision in this whole project was made before any character existed: one skeleton for everybody. Every character in the game, however their mesh is made, stands on the same 19 joint human rig, with the same joint names, in the same units. A model that does not match the standard does not ship, full stop.

Joint groupJointsWhy it matters
CoreHips, Spine, Chest, Neck, HeadLean, breathing, looking around, the sitting bend
Arms (x2)Arm, ForeArm, HandWalk swing, the wave, steering wheels, holding things
Legs (x2)UpLeg, Leg, Foot, ToeWalk and run cycles, jump crouch, sitting at a desk or in a car

The rest of the standard is five lines long, and every one of them earned its place by breaking something when it was ignored:

With the standard fixed, characters become interchangeable parts. A body from any source can be converted onto the rig, any clip can be retargeted onto any character, and the game code never learns where a body came from. That is what made the fifth route in Lesson 4 possible: when a better body source turned up, only the files changed.

Write your rig standard down before you generate anything. Ours fits on an index card, and it is the reason three different character pipelines could be tried without ever touching the game.

Lesson 3

The Animation Set: Six Clips

Six clips cover almost everything a person does in a friendly open world game. Every character carries the same six, with these exact names, all animated in place: the character walks on the spot, and the game moves the body through the world. In place animation is what lets one clip serve any speed, any slope, any vehicle-free moment, because the motion and the movement are separate dials.

ClipLengthLoopsGround speedUsed for
Idle4.0 sYes0Standing, breathing, waiting, talking
Walking1.2 sYesabout 1.0 m/sOrdinary movement on foot
Running0.73 sYesabout 2.9 m/sStick pushed to the edge, sprinting
Jump1.0 sNo0The whole arc of a jump, take-off to landing
Waving2.8 sNo0Greetings, played over the legs' current clip
Sitting4.0 sYes0Chairs, benches, and as a base pose for seats

Lengths and speeds above are the player character's; Sam and Harsh carry the same set at their own heights and paces (their walks are animated at 1.18 and 0.88 metres per second). Three details separate clips that blend from clips that fight:

Animation: the three characters waving, the player character and Harsh with arms raised while Sam raises hers a beat later
The Waving clip on all three models, straight from their GLB files. The cast waves when they greet you in the game.
Six clips, named exactly, in every file. The loader simply refuses to be surprised: if a clip name is wrong, that motion does not exist, and you find out in testing, not in a player's screenshot.

Lesson 4

Five Routes to a Character

This is the honest history, because the failures are where the tuition is. The game needed its real cast, recognisable people, moving properly, in a browser. Five routes were tried.

Route 1: flat art cards. The game began with illustrated 2D characters, portrait art on cards that glide around the world. Charming, cheap, and instantly recognisable, but they cannot turn, sit in a car, or cast a shadow, and the moment the world went fully 3D they looked like paper cutouts in a diorama. They survive as an optional look in the game's phone settings.

Route 2: bodies built from code. A function in the game builds a person from shapes (a lathe-turned torso, capsule arms and legs) dressed by a colour recipe per character, with their real face as a texture. This worked from day one and still runs underneath everything (Lesson 9). Its ceiling is style: it reads as a friendly toy person, not a GTA person.

Route 3: hand-built 3D masters. Next, full GLB masters were built programmatically to the rig standard: correct skeleton, all six clips, the right outfits, and each person's real face mapped onto the head. On paper, perfect. On screen, stiff low-poly bodies wearing photograph faces, and the verdict from the game's owner was two words: not good. The lesson cost a day and is worth a fortune: a technically correct character that looks wrong is wrong. Correct rig, correct clips, wrong art direction.

The rejected first attempt: five stiff low poly characters with photograph faces, correct outfits and correct proportions on paper, wrong on screen
Route 3, the rejected masters. Every technical box was ticked: 19 joints, six clips, real faces, the right clothes. It still looked like a wax museum. Art direction is not a box.

Route 4: image-to-3D services. The fashionable route: upload a character picture to Meshy or Tripo, get a textured mesh, auto-rig it, add animations. Three problems. Both services need your own account and spend credits, so an AI agent cannot simply go and do it for you. The likeness is a lottery: a generated sculpt of a real person comes back as a cousin, not the person. And the skeleton you get is the service's skeleton, not your standard, so every model still needs conversion before the game can use its motion. For invented characters this route is genuinely good (Lesson 10 prices it). For a cast of real people, it was the wrong tool.

Route 5: an open avatar library, restyled. Microsoft Research published the Rocketbox library: 115 professionally made human avatars, fully rigged and textured, with 417 animations, under the MIT licence. Pick the avatar whose build and face shape are closest to your person, restyle the outfit and hair to match their look, retarget the six standard clips onto the rig standard, and the character is suddenly a real 3D person with broadcast quality motion, for zero dollars and a clear licence. That is what shipped. Lesson 5 is the recipe.

One more thread ran through every route: faces kept breaking. Crops drifted, textures landed rotated, a fix for one character slid another's face sideways. Faces got their own contact sheets and their own fix rounds, three strips of test renders in a row, before they behaved. Budget for faces as a separate job (Lesson 6), not as a detail of the body job.

The route that ships is the one whose failures you can fix. Generated likenesses fail in ways you cannot edit. A restyled library avatar fails in ways you can: change the shirt, change the hair, pick a closer face.

Lesson 5

The Winning Recipe, Step by Step

Here is the exact pipeline that produced the three shipped characters. It assumes your rig standard (Lesson 2) and clip list (Lesson 3) already exist.

  1. Pick the closest avatar. Rocketbox ships 115 avatars in four levels of detail, from ultra-low to high poly. For a browser game, take a low or mid level: enough shape to read as a real person, small enough to download fast. Match on build, face shape and hair first; clothes can change, skulls cannot.
  2. Convert FBX to GLB. The library ships as FBX. One pass through Blender (or an FBX converter) produces a GLB with the mesh and textures embedded, the format the web loads natively.
  3. Restyle to the person. Recolour and swap the outfit textures to the character's signature look, and adjust hair. The three shipped looks: a blue sweater over a white tee with khaki chinos and brown sneakers; a cream knit with blue jeans and white sneakers, hair in a black ponytail; a pink floral shirt with cream trousers, a straw hat and sunglasses.
  4. Retarget the motion. Take the library's idle, walk, run, wave and sit animations and retarget them onto the 19 joint standard skeleton, trimming each clip to a clean loop. The library's own skeleton is close to standard humanoid, which is what makes this a mapping job instead of a research project.
  5. Key the jump by hand. The one clip with no library source in the right shape: a 1 second arc, crouch, launch, tuck, land, keyed pose by pose. Half a day of the whole job was this one second, and it is the clip players feel most.
  6. Compress for the web. Textures re-encoded as WebP inside the file, geometry stored with KHR mesh quantization, clips trimmed to the frames that matter. The results: about 330 KB for the player character, about 400 KB for Sam, about 380 KB for Harsh. Each downloads in about a second on a ordinary connection, and only when needed (Lesson 7).
  7. Stamp the extras. Write the character id, height, looping clips, walk and run ground speeds, and the licence credit into the root node's extras, where the loader can read them.

The full asset list for one finished character is short enough to print on the course page:

AssetWhat it isSize
sam.glbSam: skinned mesh, restyled textures, 19 joints, six clipsabout 400 KB
harsh.glbHarsh: same standard, hat and sunglasses as extra primitivesabout 380 KB
Player model GLBThe player character, same standard againabout 330 KB
faces/<id>.pngThe person's face texture, used by the code-built bodyone image each
LOOK recipeTwenty or so colour and style values per character, in the game codea few lines
e2-models.jsThe loader module shared by every character (Lesson 7)about 11 KB
The three models in the Sitting clip pose: seated in mid-air in the model viewer, knees bent, hands resting
The Sitting clip in the model viewer. In the game this pose meets real chairs, benches, cars and a train, which is why it had to be a clean, level, feet-flat sit.
Restyle, do not sculpt. Professional meshes and motion, your art direction on top. That division of labour is the whole trick, and it is why the asset bill in Lesson 10 is zero.

Lesson 6

Faces: Keeping a Real Person Recognisable

Players forgive a generic body instantly. They never forgive a wrong face. The game's cast are real people, so the face rules were set in writing before any modelling:

Mechanically, the face lives in two places. The code-built body wears the real face as a texture on its head, painted or photographed, kept bright and unlit so it matches the picture. The GLB model carries its own head, chosen and restyled to be as close as selection allows. At the distance the GTA camera actually sits, face shape, hair, skin tone and outfit agree, and recognition lands.

The craft lesson from the fix rounds: test faces on a contact sheet, all of them, every time. One render with every character's head in a row shows a drifted crop or a rotated texture in seconds. Testing one character at a time is how a fix for one face quietly slides another.

Write the face rules before the first render. Whose face is original, whose is a photo, whose is generated: three lines that prevent the most emotional bug reports a game like this can get.

Lesson 7

The Loader: New Bodies in a Running Game

The models would be worthless if wiring them in meant rewriting the game. Instead, one small module, e2-models.js, sits between the game and the files, and the game talks to it in exactly two calls:

E2Models.attach(root, id) // at the end of makeRigChar: this character exists E2Models.pose(root, speed, extra) // at the end of animChar: this is what it is doing

Everything else is the module's problem, and it is engineered around one principle: the game must never wait for a model, and never break without one.

Adding a character, once their file exists, is one line in the module's file table and one GLB dropped in the models folder. Sally, Chadwick, Dinesh and the rest of the cast still wear their code-built bodies today, and each can graduate the same way whenever a file is ready.

Two calls, total integration. If swapping your characters' bodies takes more than an afternoon of wiring, the seam is in the wrong place. Put the seam in a loader and keep the game innocent.

Lesson 8

Two Ways to Move: Clips and Pose Copying

A GTA character does two kinds of moving. Ordinary life (standing, walking, running, jumping) is repetitive and belongs to motion clips. Posed moments (waving is the borderline case, plus emotes, sitting in a car, holding the train rail) are one-offs the game invents on the fly. The loader runs both systems on the same bones and blends between them:

Clip mode. Four clips carry weights that slide with speed. Idle owns the character at rest. Walking fades in as speed rises from 0.3 to 2.2 metres per second. Running takes over from walking between 5.5 and 12. The step rate is not fixed: the stride clock speeds up with the character, from 0.85 times at a stroll to 1.75 times at a sprint, capped so feet slide a little rather than moonwalk a lot. Waving fades in and out over the top, and the jump weight follows how airborne the body is. The game's own bounce is cancelled out of the model, because the clips carry their own.

Animation: the three characters walking in place in the model viewer, arms swinging, at the Walking clip's own pace
The Walking clip in the viewer. In the game the same clip runs at a rate matched to ground speed, which is what keeps feet and floor in honest conversation.

Rig mode. The game has always posed its code-built bodies directly: a handful of pivots with names like lL (left hip), kL (left knee), aR (right shoulder), eR (right elbow) and head. The loader keeps a translation table from those nine pivots to the model's real bones, precomputed against the rest pose, so when the game poses its simple body (an emote, a driving pose, sitting on the train), the loader copies the pose onto the model's skeleton in the model's own axes. Every animation the game ever had keeps working, unmodified, on the new bodies.

The blend. Switching modes is not a cut. The loader snapshots the bone rotations, flips mode, and eases across 0.16 seconds with a smoothstep. That small number is the difference between a character who glides from a wave into a walk and one who snaps like a folding ruler. Detecting which mode should be live is equally plain: if the game posed a pivot since the last frame, or an emote is active, rig mode wins; otherwise clips run.

The three models caught mid-stride in the Walking clip, each at a different point in the step
Mid-stride, three different phases. Each instance runs its own stride clock with a random starting phase, so a crowd never marches in step.
Never retire a working animation system to adopt a better one. Run both, translate between them, and let the new bodies inherit every pose the game already knows.

Lesson 9

The Body Underneath: Characters Built From Code

Under every GLB in the game stands a complete character built from raw geometry, and it deserves its own lesson, because for most of the cast it is still the only body they have. The builder, makeRigChar, assembles a person from turned and stretched shapes: a lathe profile for the torso (eleven points from hip to neck), capsules for arms and legs, spheres for hands, ears and shoes, a shaped head with the character's face texture on the front, and hair built to a named style: short, messy, ponytail, bun, long, or a hat over any of them.

What each character wears is data, not code. One recipe per person in a table called LOOK:

sam: { shirt:'#efe3cc', pants:'#4f72a8', hem:'#e2d4b8', skin:'#e49c6c', hair:'#3a2415', hstyle:'ponytail', sleeves:'long', knit:true, shoes:'#f2f2f2', sole:'#ffffff' }, harsh:{ shirt:'#e98aa8', pants:'#d9c8aa', hem:'#cdbb9b', skin:'#d9a47a', hair:'#17110f', hstyle:'messy', hat:'#d9b56a', sleeves:'short', shoes:'#f2f2f2', sole:'#ffffff' }

Shirt, trousers, hem, skin, hair, hairstyle, sleeves, knitwear, hat, shoes: read the two entries and you can see the two people. Stripes, jackets, collars, decals, necklaces and beards are options in the same table. Changing a character's outfit is editing one line, which is why the game's phone can offer a Look setting at all.

Its animation, animChar, is one sine wave. A phase advances with speed; hips and knees swing against each other, shoulders counter-swing, the head bobs, and emotes layer extra rotations on top. It is roughly forty lines, it has never crashed, and it makes a toy person walk convincingly enough that the game shipped on it for months. The GLB models did not replace it. They stand on it: it builds the character, poses the character, and hands over to the model only when the model is ready.

Build the code body first, even if models are the dream. It gives you a playable cast on day one, a test harness for your rig standard, and a fallback that makes model failures invisible to players.

Lesson 10

Motion Libraries, Character Sources, and the Bill

Everything the shipped route used is free. That was a choice, not a constraint: here is the honest map of the alternatives, so you can choose with your eyes open. Prices checked November 13, 2026, and they move; treat every figure as an estimate.

Motion and rig sources

SourceWhat you getLicence and cost
Microsoft Rocketbox (used here)115 rigged avatars, four detail levels, 417 animations, facial blendshapesMIT, free. Keep the copyright notice in your credits
MixamoThousands of polished clips and a large character set, one standard skeletonFree with an Adobe account; the classic next step after Rocketbox
KayKitStylised low poly characters and town packs, game ready (this game uses its town pack)CC0, free, no credit required
Quaternius Universal Animation LibraryA standard humanoid with a broad clip set, built for retargetingCC0, free
Meshy and Tripo preset clipsAnimation libraries attached to their generated models, plus text to motionCredit based, priced below
Cascadeur, AccuRIGMake your own: physics aware keyframing, and free auto-rigging of your own meshesFree tiers exist; for when a stock clip does not exist
Video mocap (Rokoko, DeepMotion and friends)Film a person, get a clip. The fastest route to a signature moveSubscription tools; wonderful for one special animation

Character sources

SourceBest forCost
Rocketbox, restyledReal people at gameplay distance, clear licenceFree (MIT)
Meshy image-to-3DInvented characters from one picture, textured and riggedAbout $0.60 per finished model on the $20 a month Pro plan (1,000 credits; a textured model is about 30 credits, rigging free in the web app)
Tripo image-to-3DSame job, more credits per dollarPro is $20 a month with 3,000 credits; model 15, texture 10, rig 20, an animation 20, so about $0.45 per rigged, animated character
VRoid Studio, MakeHumanBuilding a person by hand with sliders, VRM or mesh exportFree
KayKit and Quaternius packsStylised casts that read beautifully at small sizesFree (CC0)

The Claude bill. The conversion, restyling, retargeting checks, loader module and its fixes were done by Claude working in the game's repository (Claude Code), directed by a person. There are two ways to pay for that, and the right one depends on how often you do it:

ModelAPI price, per million tokens in / outRough cost of this job, API billed
Claude Opus 5.5$4 / $20about $15 to $60
Claude Sonnet 5.5$2 / $10about $8 to $30
Claude Haiku 5.5$0.10 / $0.50 (prompts to 100K)under $2, for the mechanical steps only
Claude Fable 5.1$10 / $50about $40 to $150, more than this job needs

The arithmetic, so you can check it: a job like V 0.13 (three characters converted and verified, a loader written into a game file of about 625 KB, then several rounds of render, inspect and fix) burns roughly 3 to 8 million tokens in total, most of them cached input reads at a tenth of the input price. Multiply your own token guess by the rates above and you have your estimate. On a subscription the same work is simply inside the flat month: Claude Code comes with Pro at $20 a month, Max at $100 or $200, and this build was done that way, across about two days of back and forth, most of it waiting on renders and verdicts rather than on the model. The practical guidance: prototype and convert on Sonnet, call Opus in for the loader and the stubborn bugs, and let Haiku do renames, tables and other clerical work. Hiring the same outcome the human way (a freelance character artist to model, rig and animate one original character) is normally quoted in days per character and hundreds of dollars per character, which is the comparison that makes the table above look the way it does.

Total cash spent on the shipped characters: zero dollars in assets, a share of one Claude subscription, and about two days of a person's direction, testing and taste. The taste, it turns out, was the scarce input all along.

Your character, assigned. This week: write your rig standard on one index card, pick one person, and run the Lesson 5 recipe on a Rocketbox avatar. When they wave at you from inside your game, come and show the Starvard Discord.

Sources

The shelves this course was built from

Keep going: Next course: Your First Super Mario-Style Game · all free Starvard courses

Help build Starvard, and get $10

Starvard is a free university being built right now by kind, hard-working people. Do a first small task with us, like checking a course, adding a book to the library, or testing pages on your phone, and get $10 for it.

Get $10: help us build →