Threejs 3d Generator
From threejs-game-skills by @majidmanzarpour · View on GitHub
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games using the Tripo API. Use for text-to-3D, image-to-3D, 2D concept to 3D conversion, game-ready GLB/FBX assets, characters, creatures, buildings, props, weapons, terrain pieces, auto-rigging, animation retargeting, model texturing, LEGO/voxel/Minecraft-style stylization, low-poly/quad conversion, and browser asset pipelines. Pair with threejs-image-generator for concepts, texture references, sky/background/terrain textures, logos, icons, and GUI art before image-to-3D generation.
This skill ships inside the threejs-game-skills package. Install the package to get this skill plus everything else in the bundle.
sv install majidmanzarpour/threejs-game-skillsThree.js 3D Generator
Purpose
Create production-oriented 3D assets, then prepare them for Three.js games. This is the Three.js game system's 3D-generation layer; it uses Tripo as the provider for text-to-3D, image-to-3D, texturing, rigging, retargeting, stylization, conversion, and downloadable GLB/FBX outputs.
Resolve <this-skill-dir> in the commands below in this order: ~/.claude/skills/threejs-3d-generator, ~/.codex/skills/threejs-3d-generator, ~/.agents/skills/threejs-3d-generator, or repo skills/threejs-3d-generator.
API Key
Never store API keys in skill files or client-side game code, and never paste a key value into a report. The script reads --api-key or TRIPO_API_KEY.
Step 0, before declaring the key unavailable: run this skill's own probe and paste its literal output into the report.
python3 <this-skill-dir>/scripts/threejs_3d_asset.py probe # prints TRIPO_API_KEY=SET|MISSINGTRIPO_API_KEY=MISSING is only a valid skip/blocker reason when this output is shown. Keys defined only in a shell profile can be absent from the process env; if the plain probe prints MISSING unexpectedly, wrap it: zsh -lc 'source ~/.zprofile 2>/dev/null || true; source ~/.zshrc 2>/dev/null || true; python3 <this-skill-dir>/scripts/threejs_3d_asset.py probe'. When the director skill is loaded, prefer threejs-game-director/scripts/probe_asset_credentials.sh, which probes all three asset keys at once.
Generated model download URLs expire quickly, so download outputs immediately after successful tasks.
Tool Script
Reference gate:
- Load
references/api-notes.mdbefore provider API work, endpoint/task decisions, model-version choices, polling, postprocess, conversion, rigging, animation, or download handling. - Load
references/threejs-integration.mdbefore importing Tripo outputs into a browser game or advising GLB/FBX integration. - Load
references/image-generator-workflows.mdbefore pairingthreejs-image-generatorwith this skill for 2D concepts, texture references, UI art, logos, decals, or image-to-3D inputs.
Track required references in a reference ledger with yes/no, path, and failure reason. Do not mark an asset pipeline complete while a required reference is skipped.
Run from the user's current project directory:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py --helpCommon Commands
Recommended premium game hero model:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py text \
--prompt "game-ready [hero asset], strong readable silhouette, layered hard-surface detail, PBR materials, clean topology for browser game, centered pivot, 3/4 view, no text" \
--model-version v3.1-20260211 \
--texture-quality detailed \
--geometry-quality detailed \
--wait --download --out-dir assets/models/heroText to 3D:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py text \
--prompt "game-ready sci-fi hover bike, sleek armored panels, readable silhouette, PBR, front facing" \
--model-version v3.1-20260211 \
--texture-quality detailed \
--geometry-quality detailed \
--wait --download --out-dir assets/models/hover-bikeImage to 3D from a local threejs-image-generator concept:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py image \
--image assets/concepts/hover-bike-front.png \
--model-version v3.1-20260211 \
--enable-image-autofix \
--texture-alignment original_image \
--texture-quality detailed \
--wait --download --out-dir assets/models/hover-bikeStatus and download:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py status TASK_ID
python3 <this-skill-dir>/scripts/threejs_3d_asset.py download TASK_ID --out-dir assets/modelsTexture, rig, animate, or convert:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess \
--type texture_model --original-task-id TASK_ID \
--texture-prompt "brushed gunmetal, orange hazard decals, worn edges" \
--wait --download --out-dir assets/models/retextured
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess \
--type animate_prerigcheck --original-task-id TASK_ID --wait
# Rig version is routed by --rig-type: biped -> v1.0-20240301 (the v2.x rigger
# fails on humanoids), other body plans -> v2.5-20260210. Only pass
# --model-version to override that routing.
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess \
--type animate_rig --original-task-id TASK_ID --rig-type biped --spec tripo --wait
# animate_retarget takes the RIG task ID, not the generation task ID.
# Pass the same --rig-type used for the rig so the version routing matches
# (biped rigs use the legacy path: FBX output, ONE animation per task).
# Non-biped rigs may batch up to 5 presets per task via --animations.
# NEVER pass --animate-in-place: it corrupts the bake (mirrored limbs / exploded
# skinning). Strip root motion in the engine instead.
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess \
--type animate_retarget --original-task-id RIG_TASK_ID --rig-type quadruped \
--animations preset:idle,preset:walk,preset:run \
--wait --download --out-dir assets/models/animated
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess \
--type conversion --original-task-id TASK_ID --format GLTF \
--face-limit 20000 --wait --download --out-dir assets/models/gltf
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess \
--type stylize_model --original-task-id TASK_ID --style voxel \
--wait --download --out-dir assets/models/voxelAnimated character pipeline (generation -> prerigcheck -> validated rig with retries -> retargets -> downloads). The pipeline routes itself by body plan: biped characters automatically use the v1.0-20240301 anatomical rig with one FBX per animation (plain preset names are mapped onto the preset:biped:* library); creatures use the v2.5-20260210 rig with GLB clips:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py character-pipeline \
--prompt "stylized cyber runner character, T-pose, full body, game-ready outfit, readable silhouette" \
--animations preset:idle,preset:walk,preset:run,preset:jump \
--out-dir assets/models/cyber-runner
# Creature example: stance language matters — generate in the pose the preset expects.
python3 <this-skill-dir>/scripts/threejs_3d_asset.py character-pipeline \
--prompt "stylized wolf, quadrupedal stance, all four legs planted and separated, full body" \
--rig-type quadruped --animations preset:quadruped:walk \
--out-dir assets/models/wolfThree.js Image Generator Pairing
Use threejs-image-generator before 3D generation when the asset benefits from a strong 2D reference:
- Character concept, full-body T-pose/A-pose, front/side/back variants.
- Building, prop, vehicle, weapon, pickup, enemy, obstacle, or terrain tile reference.
- Style sheet for a whole asset family.
- Texture references: terrain, rock, metal, fabric, decals, skyboxes, backgrounds, UI materials.
- Logos, faction marks, pickup icons, hazard signs, cockpit decals, HUD symbols, and GUI panels.
Load references/image-generator-workflows.md for prompt patterns before generating or editing 2D inputs.
Three.js Integration
Load references/threejs-integration.md before importing Tripo outputs into a browser game. In short:
- Prefer GLB/PBR outputs for Three.js.
- Use
GLTFLoaderfor loading. - Use
AnimationMixerfor rigged/animated GLBs. - Keep generated model files out of client-side API flows; generation is a tooling step.
- Inspect triangle count, texture count, material count, file size, scale, pivot, bounds, and animation clips.
- Use generated 3D assets as hero/high-fidelity content, then build surrounding prop kits procedurally or with additional
threejs-3d-generator/threejs-image-generatorpasses.
Rigging and Animation Reliability
Load references/api-notes.md for the full parameter tables, retarget mechanics, and the animation prohibitions (the canonical source for all three). The rules that prevent most failures:
- Generate characters as one fused mesh: keep
--quadand--generate-partsoff (generate_partsdisables texturing;quadforces FBX output). - Require full-body T-pose or A-pose, arms away from body, symmetric, no props fused to the silhouette. Verify the rendered preview is actually in T/A-pose before rigging; regenerate if not.
- Run
animate_prerigcheckfirst (it takes no model version) and use the detectedrig_typeforanimate_rigand preset selection.riggable=falsemeans regenerate with a clearer pose, not force-rig. riggable=truedoes not guarantee a usable rig. After rigging, validate the skeleton before retargeting:threejs_3d_asset.py validate-rig rig-model.glb --rig-type biped(thecharacter-pipelinedoes this automatically). Check both presence AND chain depth: a rig with a 1-bone leg or 2-bone arm warps every clip.- Auto-rigging is nondeterministic. On validation failure, retry the rig task (~25 credits) before regenerating the model —
character-pipeline --rig-retries N(default 2) automates this, and--model-task-id TASK_IDresumes from an existing generation. Armored/hard-surface characters need the most retries; organic meshes usually rig first try. - Creatures get exactly one preset (walk/march). For multi-mode creatures (crawl + fly dragons), rig the same model twice — ground rig type for the locomotion preset,
avianfor wing chains — and drive wings procedurally in Three.js or via external clips on amixamo-spec rig. - Rig version is the main quality lever, and it differs by body plan (measured June 2026). The
character-pipelineroutes this automatically; only override--rig-model-versiondeliberately: - HUMANOIDS:
v1.0-20240301(anatomical Mixamo-like skeleton with twist bones + the largepreset:biped:*clip library: idle, walk, run, slash, jump, dances, ...). The v2.x limb-chain rigger went 0/16 on humanoid meshes — armored or not, T-pose or A-pose — always producing asymmetric chains. - CREATURES:
v2.5-20260210(v2.x handles quadruped/avian well: symmetric 5-6 bone chains). - For v1.0 rigs, retarget with
--model-version default(omit the version): the retarget enum rejects explicitv1.0-20240301(HTTP 400 code 2017) but the server default handles v1.0 rigs. - v1.0 retargets must use
--out-format fbx(the script enforces this): Tripo's GLB bake on this path exports twist-bone transforms in the wrong space and limbs collapse into the torso — the FBX of the same task is correct. Load with three.jsFBXLoaderor convert offline. v2.5 creature retargets are fine as GLB. - Use
--spec tripo(default) when Tripo presets will be retargeted;--spec mixamorigs cannot be used with Tripo retarget and are only for external animation pipelines. animate_retargettakes the RIG task ID (not the generation task ID). Batch up to 5 presets per task with--animations; batched clips return namedNlaTrack,NlaTrack.001, … in request order — map by index and rename after import. Seereferences/api-notes.mdfor the v1.0-vs-v2.5 batching and out-format rules.- Only 16 presets exist for v2.5 rigs (no
preset:attack; usepreset:slash/preset:shoot). Non-biped rig types have a single locomotion preset each; plan extra creature motion procedurally or via external retargeting. - A creature's MESH STANCE drives how presets read: a quadruped walk on an upright-standing dragon looks like a human walking. Generate creatures in the stance the animation expects (horizontal body, all fours planted) — the pipeline only auto-appends T-pose language for biped rigs.
- After download, run
threejs_3d_asset.py validate-animation clip.glb(keyframe QA: flags scale tracks, limb-stretching translation tracks, extreme rotations, and reports per-clip duration/channel coverage), then verify motion visually in the engine. - Never use
--animate-in-place(verified to corrupt clips: mirrored/crossed limbs on v1.0 rigs, exploded skinning on v2.5 — full detail inreferences/api-notes.md). Keep root motion baked and convert to in-place at import instead; exact engine snippet inreferences/threejs-integration.md. - After download, inspect
gltf.animationsclip names and counts before wiring theAnimationMixer.
Quality Rules
- Improve the user's prompt with material, silhouette, camera/readability, scale, and game-use constraints.
- For riggable characters, include full-body T-pose or A-pose in the prompt or create a T-pose reference image first.
- For Three.js games, request GLB/PBR, reasonable face limits, and texture quality matched to the performance budget.
- For mobile/browser games, favor
smart_low_poly,face_limit, later conversion, or low-poly postprocess when the asset is too expensive. - Always download output URLs immediately after success.
- Report the credential probe output, reference ledger, task IDs, output paths, model version, texture/geometry settings, animations, conversion settings, Three.js import notes, and any missing/failed steps.