
Meshyai
- 475 installs
- 305 repo stars
- Updated May 25, 2026
- opusgamelabs/game-creator
meshyai is a game-creator agent skill that generates and imports AI-made 3D meshes via Meshy for developers who need rapid 3D assets inside opusgamelabs game pipelines.
About
meshyai is an opusgamelabs game-creator agent skill that connects Meshy AI 3D generation to automated import steps in game asset pipelines. Developers describe or configure a mesh, Meshy produces the 3D model, and the skill handles bringing that asset into game-creator compatible formats and folder layouts. Teams reach for meshyai when prototyping characters, props, or environment pieces without blocking on a dedicated 3D artist. It suits game jam velocity, greybox replacement, and iterative art passes where generated meshes are refined in-engine rather than modeled entirely by hand.
- Text-to-3D
- Meshy API
- Asset import
- Prompt workflow
- Pipeline automation
Meshyai by the numbers
- 475 all-time installs (skills.sh)
- +13 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #412 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/opusgamelabs/game-creator --skill meshyaiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 475 |
|---|---|
| repo stars | ★ 305 |
| Last updated | May 25, 2026 |
| Repository | opusgamelabs/game-creator ↗ |
How do you import Meshy AI meshes into a game pipeline?
Generate and import AI-made 3D meshes via Meshy into opusgamelabs game-creator pipelines automatically.
Who is it for?
Game developers using opusgamelabs game-creator who want AI-generated 3D meshes imported without manual export and folder setup.
Skip if: Production teams requiring rigged, animation-ready characters with strict topology and licensing audits outside Meshy output.
When should I use this skill?
A game-creator project needs a new 3D prop, character, or environment mesh generated through Meshy and placed into the asset pipeline.
What you get
Imported 3D mesh files wired into game-creator asset directories and pipeline metadata
- imported 3D mesh files
- pipeline-ready asset paths
Files
Meshy AI — 3D Model Generation, Rigging & Animation
You are an expert at generating custom 3D models with Meshy AI and integrating them into Three.js browser games. Meshy is the preferred source for all 3D game assets — it generates exactly what you need from a text description or reference image, with consistent art style and game-ready topology.
Performance Notes
- Take your time with each step. Quality is more important than speed.
- Do not skip validation steps — they catch issues early.
- Read the full context of each file before making changes.
- Always run post-generation verification. Never assume orientation or scale.
Reference Files
| File | Description |
|---|---|
| api-reference.md | Full API endpoint specs, payloads, responses, task statuses, and asset retention policy |
| rigging-pipeline.md | Complete generate -> rig -> animate -> integrate pipeline with fadeToAction pattern and code examples |
| verification-patterns.md | Auto-orientation check, auto-scale fitting, floor alignment code patterns |
Why Meshy First
- Exact match: Generate precisely the character, prop, or scenery your game needs — no compromises
- Consistent style: All assets from the same generation pipeline share a cohesive look
- Custom characters: Named personalities, branded characters, unique creatures — all generated to spec
- Full pipeline: Generate → rig → animate, all from one tool
- Game-ready: Control polycount, topology, and PBR textures for optimal Three.js performance
Fallback Sources
If MESHY_API_KEY is not available and the user declines to set one up, fall back to these in order:
| Fallback | Source | Best for |
|---|---|---|
assets/3d-characters/ | Pre-built GLBs | Quick animated humanoids (Soldier, Xbot, Robot, Fox) |
find-3d-asset.mjs | Sketchfab, Poly Haven, Poly.pizza | Searching existing free model libraries |
| Procedural geometry | Code | BoxGeometry/SphereGeometry as last resort |
Authentication
All Meshy API calls require MESHY_API_KEY. Always check for this key before starting any 3D asset work.
Before prompting the user, check if the key already exists: test -f .env && grep -q '^MESHY_API_KEY=.' .env && echo "found" If found, export it with set -a; . .env; set +a and skip the prompt.
If the key is not set in the environment or .env, ask the user immediately:
I'll generate custom 3D models with Meshy AI for the best results. You can get a free API key in 30 seconds:
1. Sign up at https://app.meshy.ai
2. Go to Settings → API Keys
3. Create a new API key
>
Paste your key below like: MESHY_API_KEY=your-key-here(It will be saved to .env and redacted from this conversation automatically.)
>
Or type "skip" to use free model libraries instead.
If the user provides a key, use it via: set -a; . .env; set +a && node scripts/meshy-generate.mjs ...
If the user skips, proceed with fallback sources (character library → Sketchfab → Poly Haven).
CLI Script — scripts/meshy-generate.mjs
Zero-dependency Node.js script. Handles the full lifecycle: submit task → poll → download GLB → write meta.json.
Text to 3D (full pipeline)
Generates a 3D model from a text prompt. Two-step process: preview (geometry) → refine (texturing).
# Full pipeline: preview → refine → download
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a cartoon knight with sword and shield" \
--output public/assets/models/ \
--slug knight
# Preview only (faster, untextured — good for geometry check)
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a wooden barrel" \
--preview-only \
--output public/assets/models/ \
--slug barrel
# With PBR textures and specific polycount
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a sci-fi hover bike" \
--pbr \
--polycount 15000 \
--ai-model meshy-6 \
--output public/assets/models/ \
--slug hoverbikeImage to 3D
Turn a reference image into a 3D model. Supports URLs, local files, and base64 data URIs.
# From URL
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode image-to-3d \
--image "https://example.com/character-concept.png" \
--output public/assets/models/ \
--slug character
# From local file (auto-converts to base64)
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode image-to-3d \
--image "./concept-art/hero.png" \
--output public/assets/models/ \
--slug heroAuto-Rig (humanoids only — MANDATORY for all bipedal characters)
Adds a skeleton to a generated humanoid model and auto-downloads walking + running animation GLBs. The input task ID comes from a completed text-to-3d or image-to-3d task.
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode rig \
--task-id <meshy-task-id> \
--height 1.8 \
--output public/assets/models/ \
--slug heroThis produces 3 files automatically:
hero.glb— rigged model with skeletonhero-walk.glb— walking animation (auto-downloaded)hero-run.glb— running animation (auto-downloaded)
Always chain generate → rig as one atomic step for humanoids. Never leave humanoid characters as static models.
Limitations: Rigging works only on textured humanoid (bipedal) models with clearly defined limbs. Won't work on animals, vehicles, abstract shapes, or untextured meshes.
Animate
Apply an animation to a rigged model. Requires a completed rig task ID and an animation action ID.
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode animate \
--task-id <rig-task-id> \
--action-id 1 \
--output public/assets/models/ \
--slug hero-walkCheck Status
Poll any task's current status.
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode status \
--task-id <task-id> \
--task-type text-to-3d # or: image-to-3d, rigging, animationsNon-blocking Mode
Submit a task without waiting. Useful in pipelines.
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a crystal sword" \
--no-poll
# Later:
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode status --task-id <id> --task-type text-to-3dAutomatic GLB Optimization
All downloaded GLBs are automatically optimized via scripts/optimize-glb.mjs to reduce file sizes by 80–95%. The pipeline resizes textures to 1024×1024, converts them to WebP, and applies meshopt compression.
- Optimization runs by default after every GLB download (text-to-3d, image-to-3d, rig, animate)
- Use
--no-optimizeto skip optimization and keep the raw Meshy output - Use
--texture-size <n>to change the max texture dimension (default: 1024) - First run may take a moment as
npxdownloads@gltf-transform/cli - If
gltf-transformis unavailable, the script warns and continues with the raw file
Optimized GLBs use meshopt compression and require MeshoptDecoder at runtime — the template AssetLoader.js includes this automatically.
# Skip optimization for a specific generation
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d --prompt "a barrel" --preview-only \
--no-optimize --output public/assets/models/ --slug barrel
# Custom texture size (e.g., 512 for mobile)
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d --prompt "a barrel" --preview-only \
--texture-size 512 --output public/assets/models/ --slug barrel
# Re-optimize an existing GLB directly
node scripts/optimize-glb.mjs public/assets/models/barrel.glb --texture-size 512API Reference
See api-reference.md for full endpoint specs, payloads, responses, task statuses, and asset retention policy.
Quick Reference: Static Props (no rig needed)
For non-humanoid assets (props, scenery, buildings), skip rigging:
# Generate
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d --prompt "a wooden barrel, low poly game asset" \
--polycount 5000 --output public/assets/models/ --slug barrel
# Integrate with loadModel (regular clone, no SkeletonUtils)
const barrel = await loadModel('assets/models/barrel.glb');
scene.add(barrel);Post-Generation Verification (MANDATORY)
See verification-patterns.md for auto-orientation check, auto-scale fitting, and floor alignment code patterns.
Rigging: Mandatory for Humanoid Characters
See rigging-pipeline.md for the full generate -> rig -> animate -> integrate pipeline, including when to rig, the fadeToAction pattern, and integration code examples.
Prompt Engineering Tips
Good prompts produce better models:
| Goal | Prompt | Why |
|---|---|---|
| Game character | "a stylized goblin warrior, low poly game character, full body" | "low poly" + "game character" = game-ready topology |
| Prop | "a wooden treasure chest, stylized, closed" | Simple, specific, single object |
| Environment piece | "a fantasy stone archway, low poly, game asset" | "game asset" signals clean geometry |
| Vehicle | "a sci-fi hover bike, side view, clean topology" | "clean topology" = fewer artifacts |
Avoid:
- Multiple objects in one prompt ("a knight AND a dragon") — generate separately
- Vague prompts ("something cool") — be specific about style and form
- Interior/architectural scenes — Meshy is best for single objects
Integration with Existing Pipeline
Meshy-generated models slot into the existing 3D asset pipeline:
┌─────────────────────────────────────────────────────┐
│ 3D Asset Sources │
├──────────────┬──────────────┬───────────────────────┤
│ Free Libraries│ Character Lib │ Meshy AI │
│ find-3d-asset │ 3d-char-lib/ │ meshy-generate.mjs │
│ .mjs │ │ text/image → 3D │
│ │ │ rig → animate │
├──────────────┴──────────────┴───────────────────────┤
│ AssetLoader.js │
│ loadModel() / loadAnimatedModel() │
├─────────────────────────────────────────────────────┤
│ Three.js Game │
└─────────────────────────────────────────────────────┘All sources output GLB files into public/assets/models/. The AssetLoader.js doesn't care where the GLB came from — it loads them all the same way.
Troubleshooting
| Problem | Cause | Fix |
|---|---|---|
MESHY_API_KEY not set | Environment variable missing | Ask the user for their key or run export MESHY_API_KEY=<key>. Free keys available at https://app.meshy.ai under Settings -> API Keys. |
| Task stuck in PENDING | API queue backlog or invalid parameters | Wait 2-3 minutes, then poll status. If still PENDING after 5 minutes, cancel and resubmit with simpler prompt or lower polycount. |
| Asset download returns 404 | Meshy retains assets for only 3 days | Re-run the generation pipeline. Always download GLBs immediately after task succeeds. Store locally in public/assets/models/. |
| Rigging fails or produces broken skeleton | Model is not a clearly bipedal humanoid, or mesh is untextured | Ensure the model is a textured humanoid with visible limbs. Rigging does not work on animals, vehicles, abstract shapes, or preview-only (untextured) meshes. Re-generate with --pbr and a prompt specifying "full body humanoid". |
| Generated model does not match prompt | Vague or multi-object prompt | Use specific, single-object prompts. Include style cues ("low poly", "stylized", "game character") and avoid combining multiple objects. See Prompt Engineering Tips. |
Checklist
- [ ]
MESHY_API_KEYchecked — prompted user if not set, or user skipped to fallbacks - [ ] Prompt is specific (style, poly count, single object)
- [ ] All humanoid characters rigged — never skip rigging for bipedal models
- [ ] Downloaded GLB before 3-day expiration
- [ ] Post-generation verification done — orientation, scale, floor alignment checked
- [ ] Playwright screenshot taken — visually confirmed facing direction + fit in environment
- [ ]
rotationYset per model in Constants.js (most Meshy models needMath.PI) - [ ] Static models use
loadModel()(regular clone) - [ ] Rigged models use
loadAnimatedModel()(SkeletonUtils.clone) - [ ] Clip names logged and
clipMapdefined for animated models - [ ]
.meta.jsonsaved alongside GLB with task IDs for traceability - [ ]
npm run buildsucceeds
Meshy AI — API Reference
Base URL: https://api.meshy.ai/openapi
Text to 3D
POST /v2/text-to-3d — Create preview or refine task
Preview payload:
{
"mode": "preview",
"prompt": "a cartoon knight with sword and shield",
"ai_model": "latest",
"topology": "triangle",
"target_polycount": 10000
}Refine payload:
{
"mode": "refine",
"preview_task_id": "<preview-task-id>",
"enable_pbr": true,
"texture_prompt": "hand-painted fantasy style"
}GET /v2/text-to-3d/:id — Retrieve task (poll this)
Response when complete:
{
"id": "task-uuid",
"status": "SUCCEEDED",
"progress": 100,
"model_urls": {
"glb": "https://assets.meshy.ai/...",
"fbx": "https://assets.meshy.ai/...",
"obj": "https://assets.meshy.ai/...",
"usdz": "https://assets.meshy.ai/..."
},
"texture_urls": [
{ "base_color": "https://..." }
],
"thumbnail_url": "https://..."
}Optional parameters:
ai_model:meshy-5,meshy-6,latest(default:latest)model_type:standardorlowpolytopology:quadortriangle(default:triangle)target_polycount: 100-300,000 (default: 10,000)symmetry_mode:off,auto,on(default:auto)pose_mode:a-pose,t-pose, or empty stringenable_pbr: generates metallic, roughness, and normal maps
Image to 3D
POST /v1/image-to-3d — Create task
{
"image_url": "https://example.com/photo.png",
"ai_model": "latest",
"enable_pbr": false,
"should_texture": true,
"topology": "triangle",
"target_polycount": 10000
}GET /v1/image-to-3d/:id — Retrieve task
Supports image_url as public URL, base64 data URI (data:image/png;base64,...), or multi-image via POST /v1/multi-image-to-3d (1-4 images from different angles).
Rigging
POST /v1/rigging — Create rigging task
{
"input_task_id": "<text-to-3d or image-to-3d task id>",
"height_meters": 1.7
}GET /v1/rigging/:id — Retrieve task
Result includes:
rigged_character_glb_url— rigged GLB ready for Three.jsrigged_character_fbx_url— rigged FBXbasic_animations— walking/running GLB URLs included free
Animation
POST /v1/animations — Create animation task
{
"rig_task_id": "<rigging-task-id>",
"action_id": 1
}GET /v1/animations/:id — Retrieve task
Result includes animation_glb_url, animation_fbx_url.
Task Statuses
All tasks progress through: PENDING -> IN_PROGRESS -> SUCCEEDED / FAILED / CANCELED
Poll at 5-second intervals. Tasks typically complete in 30s-5min depending on complexity.
Asset Retention
Meshy retains generated assets for 3 days (unlimited for Enterprise). Download promptly.
Meshy AI — Rigging Pipeline
Every humanoid character MUST be rigged. Static models require hacky programmatic animation (moving wrapper groups) that looks artificial. Rigged models get proper skeletal animation — walk, run, punch, etc.
When to Rig
| Model type | Rig? | Why |
|---|---|---|
| Humanoid character (player, NPC, enemy) | YES — always | Skeletal animation for walk/run/idle/attack |
| Animal with legs | YES | Walk/run animations |
| Vehicle, prop, building | No | Static or simple rotation |
| Abstract shape, particle | No | Procedural animation |
Full Pipeline: Generate -> Rig -> Animate -> Integrate
Step 1: Generate the model
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a stylized robot boxer, low poly game character, full body" \
--pbr --polycount 15000 \
--output public/assets/models/ --slug robotStep 2: Rig (reads refineTaskId from meta.json automatically)
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode rig \
--task-id <refine-task-id-from-meta.json> \
--height 1.7 \
--output public/assets/models/ --slug robot-riggedRigging returns:
rigged_character_glb_url— rigged GLB with skeleton (use this as the base model)basic_animations.walking— walking animation GLB (free, included)basic_animations.running— running animation GLB (free, included)
Step 3: Add custom animations (optional, for game-specific actions)
# Each action_id corresponds to a different animation
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode animate \
--task-id <rig-task-id> \
--action-id <id> \
--output public/assets/models/ --slug robot-punchStep 4: Integrate with loadAnimatedModel() + AnimationMixer:
import { loadAnimatedModel } from './level/AssetLoader.js';
import * as THREE from 'three';
// Load rigged model (SkeletonUtils.clone preserves bone bindings)
const { model, clips } = await loadAnimatedModel('assets/models/robot-rigged.glb');
const mixer = new THREE.AnimationMixer(model);
// Log clip names — they vary per model
console.log('Clips:', clips.map(c => c.name));
// Load additional animation GLBs and add their clips to the same mixer
const walkData = await loadAnimatedModel('assets/models/robot-walk.glb');
const walkClip = walkData.clips[0];
const walkAction = mixer.clipAction(walkClip);
// fadeToAction pattern for smooth transitions
function fadeToAction(nextAction, duration = 0.3) {
if (activeAction) activeAction.fadeOut(duration);
nextAction.reset().setEffectiveTimeScale(1).setEffectiveWeight(1).fadeIn(duration).play();
activeAction = nextAction;
}
// In update loop:
mixer.update(delta);Meshy AI — Post-Generation Verification Patterns
After loading any Meshy-generated model, always verify orientation and scale before proceeding. Meshy models have unpredictable facing directions and scales. Skipping this step leads to backwards-facing characters and models that overflow their containers.
Auto-Orientation Check
Meshy models typically face +Z, but this varies. After loading, log the bounding box and visually verify via Playwright MCP or dev tools:
// Add this immediately after loading any GLB
model.updateMatrixWorld(true);
const box = new THREE.Box3().setFromObject(model);
const size = box.getSize(new THREE.Vector3());
const center = box.getCenter(new THREE.Vector3());
console.log(`[Model] ${slug} — size: ${size.x.toFixed(2)} x ${size.y.toFixed(2)} x ${size.z.toFixed(2)}`);
console.log(`[Model] ${slug} — center: ${center.x.toFixed(2)}, ${center.y.toFixed(2)}, ${center.z.toFixed(2)}`);Fixing facing direction:
- Start with
rotationY: Math.PI(180 degrees) — most Meshy models need this to face -Z - If the model faces +Z by default and needs to face the camera:
rotationY: 0 - If in doubt: take a screenshot, check which way the face/front is pointing, adjust
- Store
rotationYin Constants.js per model — never hardcode in entity files
Auto-Scale Fitting
Models must fit within their game context. After loading:
// Calculate scale to fit a target height
const box = new THREE.Box3().setFromObject(model);
const currentHeight = box.max.y - box.min.y;
const targetHeight = 2.0; // desired height in world units
const autoScale = targetHeight / currentHeight;
model.scale.setScalar(autoScale);For container fitting (e.g., robots inside a ring):
// Ensure model fits within container bounds
const containerWidth = RING.PLATFORM_WIDTH * 0.8; // 80% of ring width
const modelWidth = box.max.x - box.min.x;
if (modelWidth * currentScale > containerWidth) {
const fitScale = containerWidth / modelWidth;
model.scale.setScalar(Math.min(currentScale, fitScale));
}Always take a Playwright screenshot after model integration to visually verify: 1. Characters face the correct direction 2. Characters fit within their environment 3. Characters don't clip through floors/walls/each other
Floor Alignment
Center the model on X/Z and plant feet on Y=0:
const box = new THREE.Box3().setFromObject(model);
const center = box.getCenter(new THREE.Vector3());
model.position.y = -box.min.y; // feet on ground
model.position.x = -center.x; // centered X
model.position.z = -center.z; // centered ZRelated skills
FAQ
What does the meshyai skill do in game-creator?
meshyai generates 3D meshes through Meshy AI and imports them into opusgamelabs game-creator pipelines. Developers get automated asset placement instead of manually exporting Meshy files and copying them into project folders.
Which game framework does meshyai target?
meshyai is built for opusgamelabs game-creator workflows. It connects Meshy 3D generation output to game-creator import conventions so agents and developers can add AI-made meshes to active game projects.