Generate customizable 3D emoji assets from Twemoji SVGs, built with Three.js. Choose from multiple shape presets (coins, speech bubbles), tweak every parameter, preview in real-time, and export as GLB, OBJ, STL, or USDZ — all in your browser. Includes a CLI for batch generation.
Pre-generated packs of all 4,009 emojis in bubble, coin, and flat shapes are also available for download
How it works
Each Twemoji SVG is parsed into individual color paths. Every path is extruded into 3D geometry via ExtrudeGeometry, layered with small Z offsets to preserve draw order. The emoji group is then mounted onto a shape base (coin, bubble, pin, badge) or exported standalone (flat). On export, an optional merge-materials pass bakes all colors into a single texture atlas — one pixel per unique color — and remaps UVs so the final GLB has exactly one material, ready for game engines.
unreal.mp4
Pre-generated 4,009 emoji GLB asset packs are available for download in bubble, coin, and flat shapes.
Download Pre-generated Assets on Google Drive
git clone https://github.com/wangyz1999/3d-emoji-assets-generator.git
cd 3d-emoji-assets-generator
npm installnpm run devOpen http://localhost:3000.
Important
The CLI renders models via a headless browser — the dev server must be running before you generate anything. You need two terminals open at the same time:
# Terminal 1 — keep this running
npm run dev# Terminal 2 — run your generate commands here
npm run generate -- ...npm run generate -- --shape bubble --emojis joy --format glb --output ./output/--emojis accepts a shortname (joy), a Unicode code (1f602), a comma-separated mix of both, or all.
npm run generate -- --shape bubble --emojis all --format glb --output ./output/bubble/Use --concurrency to render multiple emojis in parallel (default: 4):
npm run generate -- --shape bubble --emojis all --format glb --output ./output/bubble/ --concurrency 8npm run generate -- --shape bubble --emojis all --format glb --output ./output/ --emoji-source localFor all available flags and per-shape style parameters, see the CLI Reference.
You can also view the full parameter list interactively in the web app — the CLI Command panel at the bottom of the left sidebar shows a live command that reflects your current settings.
By default, exported models bake all colors into one texture atlas so the .glb uses a single material. This is critical for game engines like Unreal Engine and Unity, where each material creates a separate draw call — an emoji like the astronaut would otherwise produce 13+ materials.
Enable the "Merge into single material" toggle in the web app, or add --merge-materials in the CLI:
npm run generate -- --shape coin --emojis astronaut --format glb --merge-materials --output ./output/Without this flag, each SVG color becomes its own material — fine for Blender editing, but impractical in game engines.
| Format | Extension |
|---|---|
| GLB | .glb |
| OBJ | .obj |
| STL | .stl |
| USDZ | .usdz |
Contributions, feature requests, bug reports, and ideas are all welcome! Feel free to submit a Pull Request or open an issue.
See the LICENSE and LICENSE-GRAPHICS files for full license texts.
Code licensed under the MIT License: http://opensource.org/licenses/MIT
Graphics licensed under CC-BY 4.0: https://creativecommons.org/licenses/by/4.0/
The emoji graphics used in generated assets are from Twemoji by Twitter/X Corp. If you distribute or publish generated assets, you must include attribution to Twemoji

