PLAYABLE · THREE.JS · 864,931 TRIANGLES
The same pack,
in three dimensions.
A town square, a long hall, and a vault with something in it. Each room is one generated picture, rebuilt in 3D with a walkable floor. The character you move and the ones that come at you are the rigged GLBs from the free pack, playing the clips that ship inside them.
Starting the renderer.
WASD or arrows to move. Shift to run.
WASD moves, Shift runs. Click or J attacks, and three hits chain. Hold right mouse or K to block; raise it just before a blow lands to parry. F bashes, Q drinks, E talks or uses a door. The town and the hall each open a glowing ring at their far door.
What is running
| In the world | From the pack | The command that made it |
|---|---|---|
| The town square, the hall and the vault | One picture each, rebuilt as a GLB with the source camera and a walkable floor | assetyard generate image painted the pictures. The environment backend rebuilt them, and assetyard generate environment runs the same step. |
| You, the merchant, the stalkers and the warden | Rigged glTF with clips inside | assetyard generate model --animation-pack |
| Sword, greatsword, crates | Prop meshes, held in hand bones or set on the floor | assetyard generate model --geometry-profile prop |
| Shield face | A painted image cut to a heater outline with an iron rim, strapped to the forearm | assetyard generate image |
| Score, impacts, the cry | Music, effects, speech | assetyard generate music · sfx · tts |
Nothing here is a placeholder cube with a placeholder texture. Every figure, prop and sound came out of the same command line with one account. The rooms came from the environment backend, which runs from the same command line.
The rooms are pictures
The image model paints each room from a raised viewpoint, with a wide floor in frame. The environment backend estimates the depth of every pixel and returns one GLB: a backdrop mesh at metric scale, the camera that took the picture, and a floor collider with a walkable grid.
Every account runs it with one command. It costs 0 credits during the free beta.
assetyard generate environment \
--reference-image assets/environment-hall.png \
--out assets/environment-hall.glbThe game camera starts where the picture was taken. It pans and zooms to follow the fight, drifts a little, and pushes in when a fight starts, so the depth of the room shows. It never walks around the room, because one picture has nothing behind its pillars. The backdrop writes depth, so the figures pass behind pillars and walls. People, crates and lamps are placed by picture position, cast onto the rebuilt floor.
How one picture becomes a room, and how to make your own →
The clips are in the file
A rigged character from Asset Yard arrives as a single GLB: mesh, skeleton, skin weights and named animation clips in one download. Three.js plays them with no conversion step and no import pipeline.
assetyard generate model \
--prompt "A shieldmaiden warrior in a neutral A-pose" \
--geometry-profile character \
--animation-pack humanoid_sword \
--out assets/hero.glbThis build asks each character for a role rather than a clip name, and takes the first clip the pack actually provides. That is what the readout below reports, so you can see which swing is a real sword clip and which is standing in.
Reading the clips out of the GLB files.
Every published animation pack and its clips →
Use it as a template
The world is one file, no build step, no bundler. Swap the asset names at the top and it is a different game: a lot of what people call a prototype is this file with other meshes in it.
curl -O https://assetyard.dev/demo3d/world3d.jsIt reads window.HOLLOWREACH_3D for the file names and window.PACK_VERSIONS for cache busting. Both are written by the page, so a new pack needs no code change.
The other half
The turn-based crawler runs on the flat half of the same pack, in Phaser.