Threejs 3D Generator
valkor-ai/loom
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games via the Tripo API.
3D asset engineer that finds, downloads, and integrates GLB/GLTF models into Three.js browser games.
$ npx skills add corosolto/client --skill game-3d-assets -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install corosolto/client game-3d-assets --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/corosolto/client.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/game-3d-assets .claude/skills/game-3d-assets && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "game-3d-assets" agent skill from https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assets into .claude/skills/game-3d-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "game-3d-assets", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assetsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add corosolto/client --skill game-3d-assets -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install corosolto/client game-3d-assets --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/corosolto/client.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/game-3d-assets .agents/skills/game-3d-assets && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "game-3d-assets" agent skill from https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assets into .agents/skills/game-3d-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "game-3d-assets", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add corosolto/client --skill game-3d-assets -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install corosolto/client game-3d-assets --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/corosolto/client.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/game-3d-assets .cursor/skills/game-3d-assets && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "game-3d-assets" agent skill from https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assets into .cursor/skills/game-3d-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "game-3d-assets", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/corosolto/client.git --path .agents/skills/game-3d-assets--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add corosolto/client --skill game-3d-assets -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install corosolto/client game-3d-assets --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/corosolto/client.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/game-3d-assets .gemini/skills/game-3d-assets && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "game-3d-assets" agent skill from https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assets into .gemini/skills/game-3d-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "game-3d-assets", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install corosolto/client game-3d-assetsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add corosolto/client --skill game-3d-assets -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/corosolto/client.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/game-3d-assets .github/skills/game-3d-assets && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "game-3d-assets" agent skill from https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assets into .github/skills/game-3d-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "game-3d-assets", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add corosolto/client --skill game-3d-assets -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install corosolto/client game-3d-assets --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/corosolto/client.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/game-3d-assets .opencode/skills/game-3d-assets && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "game-3d-assets" agent skill from https://github.com/corosolto/client/tree/main/.agents/skills/game-3d-assets into .opencode/skills/game-3d-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "game-3d-assets", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
game-3d-assets3D asset engineer that finds, downloads, and integrates GLB/GLTF models into Three.js browser games.
Game 3D Assets is an agent skill from corosolto/client. 3D asset engineer that finds, downloads, and integrates GLB/GLTF models into Three.js browser games. Use when a 3D game needs real models instead of primitive BoxGeometry/SphereGeometry shapes.
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development, covering Game assets and audio and 3D graphics and WebGL. It works with Three.js. The repository describes itself as: FPS satírico de navegador: 5 facções brasileiras caricatas, 44 personagens, 5 mapas e 26 armas — rounds e Capture the Flag contra bots, direto na aba, sem instalar nada. Three.js… The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 23c16f5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
nodenpmcurlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
raw.githubusercontent.comAlso links to:
sketchfab.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
MESHY_API_KEYSKETCHFAB_TOKENPOLY_PIZZA_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Game 3D Assets loads about 5.4k tokens when it runs. Until then it costs about 52 tokens; SKILL.md has 1,900 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
`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.> (It will be saved to .env and redacted from this conversation automatically.)`test -f .env && grep -q '^SKETCHFAB_TOKEN=.' .env && echo "found"`If found, export it with `set -a; . .env; set +a` and skip the prompt.> (It will be saved to .env and redacted from this conversation automatically.)Then use it via: `set -a; . .env; set +a && node scripts/find-3d-asset.mjs ...`ompts. The API key is stored in a local `.env` file and passed only to the Meshy API. Generated models are downloaded asFAB_TOKEN`) are stored in the project's `.env` file (which should be gitignored) and loaded via environment variables. KAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from corosolto/client at commit 23c16f5, republished under its MIT licence (© corosolto). 1,900 words, ~5,421 tokens.
.claude/skills/game-3d-assets/SKILL.md (or your agent's skills folder).You are an expert 3D game artist and integrator. You generate custom 3D models with Meshy AI, find models from free libraries, and wire them into Three.js games — replacing primitive geometry with recognizable 3D models.
Primitive cubes and spheres are fast to scaffold, but players can't tell a house from a tree. Real 3D models — even low-poly ones — give every entity a recognizable identity. Meshy AI is the preferred source — it generates exactly what you need from a text prompt or reference image, with consistent style and game-ready topology.
| Tier | Source | Auth | Best for |
|---|---|---|---|
| 1. Meshy AI (preferred) | meshy.ai | MESHY_API_KEY | Custom characters, props, and scenery from text/image — exact match to game theme |
| 2. Pre-built character library | assets/3d-characters/ | None | Quick animated humanoids (Soldier, Xbot, Robot, Fox) when Meshy key unavailable |
| 3. Sketchfab | sketchfab.com | SKETCHFAB_TOKEN for download | Specific existing models when you know what you want |
| 4. Poly Haven | polyhaven.com | None | CC0 environment props |
| 5. Poly.pizza | poly.pizza | POLY_PIZZA_API_KEY | 10K+ low-poly CC-BY models |
| 6. Procedural geometry (last resort) | Code | N/A | BoxGeometry/SphereGeometry |
Meshy AI is the preferred source for all 3D assets. 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 MESHY_API_KEY is not set, ask the user before falling back to other tiers:
I'd like to generate custom 3D models with Meshy AI for the best results. You can get a free API key:
- Sign up at https://app.meshy.ai
- Go to Settings → API Keys
- 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 for all meshy-generate.mjs calls. If they skip, fall through to Tier 2+.
These GLB files from the Three.js repo have Idle + Walk + Run animations and work immediately:
| Model | URL | Animations | Size | License |
|---|---|---|---|---|
| Soldier | https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/Soldier.glb | Idle, Walk, Run, TPose | 2.2 MB | MIT |
| Xbot | https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/Xbot.glb | idle, walk, run + additive poses | 2.9 MB | MIT |
| RobotExpressive | https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/RobotExpressive/RobotExpressive.glb | Idle, Walking, Running, Dance, Jump + 8 more | 464 KB | MIT |
| Fox | https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/Fox/glTF-Binary/Fox.glb | Survey (idle), Walk, Run | 163 KB | CC0/CC-BY 4.0 |
assets/3d-characters/)These characters have gesture/performance animations instead of walk/run. Best for standing-position games (debate, dance-off, boxing, rhythm):
| Model | Animations | Faces | Size | License |
|---|---|---|---|---|
| Trump | StillLook (idle), Clap, Dance, Point, Talk, Twist | 1,266 | 1.2 MB | CC-BY (Sketchfab) |
| Biden | 1 Mixamo idle/sway | 50,000 | 3.3 MB | CC-BY (Sketchfab) |
Copy from the character library (no auth needed):
cp <plugin>/assets/3d-characters/models/trump.glb public/assets/models/
cp <plugin>/assets/3d-characters/models/biden.glb public/assets/models/Trump clipMap:
{
idle: 'root|TrumpStillLook_BipTrump',
clap: 'root|TrumpClap1_BipTrump',
dance: 'root|Trumpdance1_BipTrump',
point: 'root|TrumpPoint_BipTrump',
talk: 'root|TrumpTalk1_BipTrump',
twist: 'root|TrumpTwist_BipTrump'
}Biden clipMap:
{ idle: 'mixamo.com' }Game design for gesture characters: Since these lack walk/run, design games where characters are stationary — debate battles, dance-offs, boxing rings, rhythm games, or turn-based encounters. Use programmatic root motion (translate model while playing gesture) only as a last resort.
Download with curl — no auth needed:
curl -L -o public/assets/models/Soldier.glb "https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/Soldier.glb"Clip name mapping varies per model. Always log clip names on load and define a clipMap per character:
// Soldier: { idle: 'Idle', walk: 'Walk', run: 'Run' }
// Xbot: { idle: 'idle', walk: 'walk', run: 'run' } (lowercase)
// Robot: { idle: 'Idle', walk: 'Walking', run: 'Running' }
// Fox: { idle: 'Survey', walk: 'Walk', run: 'Run' }For EACH character in the game, try these tiers in order:
Tier 1 — Generate with Meshy AI (preferred): Generate a custom character model matching the game's art direction. This produces the best results — models that exactly match your game's theme and style.
# Generate character from text description
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a stylized <character description>, low poly game character, full body, t-pose" \
--polycount 15000 --pbr \
--output public/assets/models/ --slug <character-slug>
# Then rig for animation (humanoid characters)
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode rig --task-id <refine-task-id> \
--height 1.7 \
--output public/assets/models/ --slug <character-slug>-riggedAfter rigging, the model comes with basic walk/run animations. Log clip names to build the clipMap.
For named personalities, be descriptive: "a cartoon caricature of <Name>, <hair/glasses/suit details>, low poly game character".
Tier 2 — Pre-built in assets/3d-characters/: If Meshy is unavailable, check manifest.json for a name/theme match. Copy the GLB. Done.
Tier 3 — Search Sketchfab for character-specific model: Use find-3d-asset.mjs:
node scripts/find-3d-asset.mjs --query "<character name> animated character" --max-faces 10000 --list-onlyTier 4 — Generic library fallback: Use the best thematic match from assets/3d-characters/:
Multi-character games: When using Meshy, generate each character with distinct descriptions for visual variety. When falling back to library models, assign different models to each character (e.g., Soldier for one, Xbot for another).
Only needed if falling back to Sketchfab. Search is free but download requires SKETCHFAB_TOKEN. Before prompting, check if the key already exists:
test -f .env && grep -q '^SKETCHFAB_TOKEN=.' .env && echo "found"
If found, export it with set -a; . .env; set +a and skip the prompt.
If needed and not set, ask the user:
I need a Sketchfab API token to download this model. You can get one for free:
- Sign in at https://sketchfab.com
- Go to https://sketchfab.com/settings/password → "API Token"
- Copy the token
Paste your token below like:
SKETCHFAB_TOKEN=your-token-here(It will be saved to .env and redacted from this conversation automatically.)
Then use it via: set -a; . .env; set +a && node scripts/find-3d-asset.mjs ...
Use scripts/find-3d-asset.mjs for both character searches AND non-character models (props, scenery, buildings):
node scripts/find-3d-asset.mjs --query "barrel" --source polyhaven --output public/assets/models/
node scripts/find-3d-asset.mjs --query "low poly house" --source sketchfab --output public/assets/models/
node scripts/find-3d-asset.mjs --query "coin" --list-onlyCreate src/level/AssetLoader.js. Critical: use SkeletonUtils.clone() for animated models — regular .clone() breaks skeleton bindings and causes T-pose.
import * as THREE from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';
import * as SkeletonUtils from 'three/addons/utils/SkeletonUtils.js';
const loader = new GLTFLoader();
loader.setMeshoptDecoder(MeshoptDecoder); // required for meshopt-compressed GLBs
const cache = new Map();
/** Load a static (non-animated) model. Uses regular clone. */
export async function loadModel(path) {
const gltf = await _load(path);
const clone = gltf.scene.clone(true);
clone.traverse((c) => {
if (c.isMesh) { c.castShadow = true; c.receiveShadow = true; }
});
return clone;
}
/** Load an animated (skeletal) model. Uses SkeletonUtils.clone to preserve bone bindings. */
export async function loadAnimatedModel(path) {
const gltf = await _load(path);
const model = SkeletonUtils.clone(gltf.scene);
model.traverse((c) => {
if (c.isMesh) { c.castShadow = true; c.receiveShadow = true; }
});
return { model, clips: gltf.animations };
}
export function disposeAll() {
cache.forEach((p) => p.then((gltf) => {
gltf.scene.traverse((c) => {
if (c.isMesh) {
c.geometry.dispose();
if (Array.isArray(c.material)) c.material.forEach(m => m.dispose());
else c.material.dispose();
}
});
}));
cache.clear();
}
function _load(path) {
if (!cache.has(path)) {
cache.set(path, new Promise((resolve, reject) => {
loader.load(path, resolve, undefined,
(err) => reject(new Error(`Failed to load: ${path} — ${err.message || err}`)));
}));
}
return cache.get(path);
}GLBs optimized by scripts/optimize-glb.mjs (or meshy-generate.mjs / find-3d-asset.mjs which call it automatically) use meshopt compression. The MeshoptDecoder import + loader.setMeshoptDecoder() call above is required to load these compressed files. Without it, Three.js will fail to parse the geometry buffers.
| Method | Use for | What happens |
|---|---|---|
gltf.scene.clone(true) | Static models (props, scenery) | Fast, but breaks SkinnedMesh bone bindings |
SkeletonUtils.clone(gltf.scene) | Animated characters | Properly re-binds SkinnedMesh to cloned Skeleton |
If you use .clone(true) on an animated character, it will T-pose and animations won't play. Always use SkeletonUtils.clone() for anything with skeletal animation.
The proven pattern from the official Three.js webgl_animation_walk example:
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
// Setup
const orbitControls = new OrbitControls(camera, renderer.domElement);
orbitControls.enablePan = false;
orbitControls.enableDamping = true;
orbitControls.maxPolarAngle = Math.PI / 2 - 0.05; // don't go underground
orbitControls.target.set(0, 1, 0);
// Each frame — move camera and target by same delta as player
const dx = player.position.x - oldX;
const dz = player.position.z - oldZ;
orbitControls.target.x += dx;
orbitControls.target.z += dz;
orbitControls.target.y = player.position.y + 1;
camera.position.x += dx;
camera.position.z += dz;
orbitControls.update();const _v = new THREE.Vector3();
const _q = new THREE.Quaternion();
const _up = new THREE.Vector3(0, 1, 0);
// Get camera azimuth from OrbitControls
const azimuth = orbitControls.getAzimuthalAngle();
// Build input vector from WASD
let ix = 0, iz = 0;
if (keyW) iz -= 1;
if (keyS) iz += 1;
if (keyA) ix -= 1;
if (keyD) ix += 1;
// Rotate input by camera azimuth → world space movement
_v.set(ix, 0, iz).normalize();
_v.applyAxisAngle(_up, azimuth);
// Move player
player.position.addScaledVector(_v, speed * delta);
// Rotate model to face movement direction
// +PI offset because most GLB models face +Z but atan2 gives 0 for +Z
const angle = Math.atan2(_v.x, _v.z) + Math.PI;
_q.setFromAxisAngle(_up, angle);
model.quaternion.rotateTowards(_q, turnSpeed * delta);fadeToAction(name, duration = 0.3) {
const next = actions[name];
if (!next || next === activeAction) return;
if (activeAction) activeAction.fadeOut(duration);
next.reset().setEffectiveTimeScale(1).setEffectiveWeight(1).fadeIn(duration).play();
activeAction = next;
}
// In update loop:
if (isMoving) {
fadeToAction(shiftHeld ? 'run' : 'walk');
} else {
fadeToAction('idle');
}
if (mixer) mixer.update(delta);After loading ANY 3D model (Meshy-generated, library, or Sketchfab), always verify orientation and scale. Skipping this leads to backwards characters and models that overflow their containers.
rotationY per model in Constants.js. Start with Math.PI for Meshy models.position.y = -box.min.y to plant feet on groundSee the meshyai skill's "Post-Generation Verification" section for detailed code patterns.
.clone() instead of SkeletonUtils.clone(). The skeleton binding is broken.rotationY: Math.PI in Constants.js. Always verify with a screenshot.mixer.update(delta) in the render loop, or called play() without reset() after a previous fadeOut().camera.lookAt() when using OrbitControls. It manages lookAt internally.THREE.GridHelper) and place props near spawn so movement is visible.clips.map(c => c.name) on load and define a clipMap per character. Never hardcode clip names.Before starting, check if MESHY_API_KEY is available. If not, ask the user for one (see "Meshy API Key" section above). If the user skips, proceed with Tier 2+ fallbacks.
package.json to confirm Three.jsBoxGeometry, SphereGeometry, etc.| Entity | Model Source | Type | Notes |
|---|---|---|---|
| Player | Meshy text-to-3d → rig | Animated character | Custom generated + rigged |
| Enemy | Meshy text-to-3d → rig | Animated character | Custom generated + rigged |
| Tree | Meshy text-to-3d | Static prop | "a low poly stylized tree, game asset" |
| Barrel | Meshy text-to-3d | Static prop | "a wooden barrel, low poly game asset" |
If Meshy unavailable, fall back to library characters + find-3d-asset.mjs for props.
# With Meshy (preferred) — generate each entity
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode text-to-3d \
--prompt "a heroic knight, low poly game character, full body" \
--polycount 15000 --pbr \
--output public/assets/models/ --slug player
# Rig humanoid characters for animation
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
--mode rig --task-id <refine-task-id> --height 1.7 \
--output public/assets/models/ --slug player-rigged
# Generate static props
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
# Fallback: library characters
cp <plugin-root>/assets/3d-characters/models/Soldier.glb public/assets/models/
# Fallback: search free libraries for props
node scripts/find-3d-asset.mjs --query "barrel" --source polyhaven --output public/assets/models/src/level/AssetLoader.js with SkeletonUtils.clone() for animated modelsclipMap per modelOrbitControls camera with target-follow patternfadeToAction() for animation crossfadingapplyAxisAngle(_up, azimuth)Math.PI offset to model facing rotationTHREE.GridHelper to ground for visible movement referencenpm run dev and walk around with WASDnpm run build to confirm no errorsCause: Using .clone(true) instead of SkeletonUtils.clone() breaks skeleton bindings on animated GLB models.
Fix: Always use SkeletonUtils.clone() from three/addons/utils/SkeletonUtils.js for any model with animations. Regular .clone() copies the mesh but not the skeleton bindings.
Cause: The Sketchfab API requires authentication for model downloads, or the model license doesn't permit downloading.
Fix: Ensure SKETCHFAB_TOKEN is set in environment. Check the model's license on Sketchfab — only CC-licensed models can be downloaded via API. Try alternative sources (Poly Haven, Poly.pizza) which don't require auth for free models.
Cause: Some GLB files use meshopt compression which requires a decoder not loaded by default in Three.js.
Fix: Add the meshopt decoder before loading: import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js'; loader.setMeshoptDecoder(MeshoptDecoder);
Cause: Animation clips not connected to the model's AnimationMixer, or clip names don't match expected values.
Fix: Create an AnimationMixer for the model, then use mixer.clipAction(clip).play(). Log gltf.animations.map(a => a.name) to see available clip names — they vary by model source. Define a clipMap per character to map generic names (idle, walk, run) to actual clip names.
Cause: Manual camera position updates conflict with OrbitControls trying to maintain its own camera state.
Fix: Don't set camera.position directly when using OrbitControls. Instead, update controls.target to follow the player, and let OrbitControls manage the camera position relative to the target. Call controls.update() once per frame in the animation loop.
.env file and passed only to the Meshy API. Generated models are downloaded as GLB binaries.MESHY_API_KEY, SKETCHFAB_TOKEN) are stored in the project's .env file (which should be gitignored) and loaded via environment variables. Keys are never embedded in game source code or deployed artifacts.AssetLoader.js uses SkeletonUtils.clone() for animated modelsclipMap defined per character model (clip names vary)OrbitControls with target-follow (not manual camera.lookAt)applyAxisAngle(_up, azimuth)+ Math.PI offset in atan2fadeToAction() pattern with reset() before fadeIn().play()mixer.update(delta) called every framedestroy() disposes geometry + materials + stops mixernpm run build succeeds© corosolto, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/game-3d-assets of corosolto/client.
Open the folder on GitHubat commit 23c16f5
Game 3D Assets next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Game 3D Assets this skillcorosolto/client | 257 | — | ~5.4k | Automated safety check: Notes | MIT | |
| Threejs 3D Generatorvalkor-ai/loom | 1.2k | 1 repos | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Living BackdropTheOrcDev/skills | 106 | — | ~2.3k | Automated safety check: Pass | None | |
| Blender Web Export Pipelinefreshtechbro/claudedesignskills | 1k | — | ~4.2k | Automated safety check: Pass | MIT | |
| Pneuma Lucidpandazki/pneuma-skills | 161 | — | ~4.6k | Automated safety check: Warn | MIT | |
| Vtj Resource ManagementhexianWeb/Third-Person-MC | 195 | — | ~1.6k | Automated safety check: Pass | MIT |
valkor-ai/loom
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games via the Tripo API.
TheOrcDev/skills
Turn one still image into a living web backdrop - depth parallax that follows the pointer, a subject that breathes, and ambient wind, cloud drift, light and dust, in a single WebGL shader with a…
freshtechbro/claudedesignskills
Exports and optimizes Blender 3D models and animations for the web as glTF, covering batch Python scripting, texture baking, decimation and LOD generation for Three.js and Babylon.js.
pandazki/pneuma-skills
Pneuma Lucid Mode workspace guidelines. An agent skill from pandazki/pneuma-skills.
hexianWeb/Third-Person-MC
Loads and manages 3D assets via the Resources system. An agent skill from hexianWeb/Third-Person-MC.
glifxyz/glif-mcp-server
Make art and media for a game you are building with Glif: character reference sheets, consistent characters, pixel-art sprite sheets with animation cycles, seamless and PBR textures, 3D models, item…
corosolto/client
Build and iterate playable Three.js game systems. An agent skill from corosolto/client.
corosolto/client
Load glTF/GLB models in three.js with GLTFLoader and play their skinned animations with AnimationMixer, including DRACO/Meshopt-compressed meshes and KTX2 textures.
corosolto/client
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games using the Tripo API.
corosolto/client
Light and shade a three.js scene: choose materials (MeshStandardMaterial PBR vs unlit MeshBasicMaterial), add ambient/hemisphere/directional/point/spot lights, turn on shadow maps, and use an…
corosolto/client
Stand up a three.js scene: import maps and the three/addons path, the Scene/PerspectiveCamera/WebGLRenderer trio, the setAnimationLoop render loop, responsive resize, and OrbitControls.
corosolto/client
Primary entrypoint for complete Three.js browser game creation and premium iteration.
Works with
Categories
3D asset engineer that finds, downloads, and integrates GLB/GLTF models into Three.js browser games. Game 3D Assets is an agent skill from corosolto/client.js browser games.
Game 3D Assets fits situations like: A 3D game needs real models instead of primitive BoxGeometry/SphereGeometry shapes; tasks that involve Game assets and audio; tasks that involve 3D graphics and WebGL.
Run `npx skills add corosolto/client --skill game-3d-assets -a claude-code`. Or copy the skill folder (.agents/skills/game-3d-assets in corosolto/client) into .claude/skills/game-3d-assets in your project. Claude Code loads it when a task matches its description.
Run `npx skills add corosolto/client --skill game-3d-assets -a codex`. Or copy the skill folder (.agents/skills/game-3d-assets in corosolto/client) into .agents/skills/game-3d-assets in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add corosolto/client --skill game-3d-assets -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/game-3d-assets, .gemini/skills/game-3d-assets, .github/skills/game-3d-assets and .opencode/skills/game-3d-assets in your project.
Going by SKILL.md and its folder, Game 3D Assets needs the command-line tools its instructions call (node, npm and curl) and credentials named MESHY_API_KEY, SKETCHFAB_TOKEN and POLY_PIZZA_API_KEY. Our summary lists: A credential in MESHY_API_KEY; A credential in SKETCHFAB_TOKEN.
SKILL.md names 2 domains. In commands or code: raw.githubusercontent.com; the agent is likely to contact it when it follows the instructions. As links in the text: sketchfab.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Game 3D Assets is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Game 3D Assets: Threejs 3D Generator (valkor-ai/loom, 1.2k stars), Living Backdrop (TheOrcDev/skills, 106 stars), Blender Web Export Pipeline (freshtechbro/claudedesignskills, 1k stars) and Pneuma Lucid (pandazki/pneuma-skills, 161 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
corosolto (a GitHub organization) maintains it in corosolto/client, which has 257 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 10, 2026.
Source: corosolto/client on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.