3D generation: Tripo vs the Meshy pipeline
Investigated 2026-08-31 at Chris's ask, while he playtested the waves.
What the game does today
Three tiers, three different techniques — this matters because "switch to Tripo" means different things per tier:
| tier | source | technique |
|---|---|---|
| swarm enemies (9 types) | actors.js |
hand-built primitives + ink outline, instanced, ~1KB each |
| special-grade bosses | boss3d.js |
Meshy multi_image_to_3d GLB → bake-models.mjs (strip clips, 1024 WebP textures) → re-skinned in-engine with MeshToonMaterial |
| students | actors.js |
primitive rigs |
The Meshy baseline (2026-08-25 experiment, docs/SESSION-LOG.md): 30cr per
boss with texture at 20K tris → 4.4MB raw GLB → ~1.1-2.5MB after bake. The
generated texture is largely DISCARDED — boss3d.js re-skins with the house
toon ramp, so what the pipeline actually consumes is geometry.
The finding that reframes the question
Tripo is already in the tooling. The same MCP that ran the Meshy bosses
exposes tripo_h3_1_image_to_3d, tripo_h3_1_multiview_to_3d and a Tripo
text-to-3D — alongside Meshy 6/7, Hunyuan3D v3/v3.1 and Meta SAM-3. No new
account, no new key, same credit pool. "Compare Tripo" is a 9-credit
same-input bake-off, not a vendor migration.
Costs measured/preflighted on our account (2026-08-31):
| model | config | credits |
|---|---|---|
| Tripo H3.1 image→3D | 20K faces, textured, no PBR | 9 |
| Meshy multi-image→3D | 20K tris, textured (8/25 actual) | 30 |
Native Tripo API (for reference, if ever direct): 100 credits = $1, image→3D
20-30 credits ($0.20-0.30/gen), with quad remesh, smart low-poly, auto-rig
(25cr) and animation retarget (10cr/clip) as add-ons. Higher-fidelity H3.1
via resellers runs ~$0.075-0.15/gen. No free tier documented.
Head-to-head: same input (janitor.png)
Both asked for ~20K faces, textured, from the identical source PNG.
| Meshy multi_image_to_3d (8/25) | Tripo H3.1 (2026-08-31) | |
|---|---|---|
| credits | 30 | 9 |
| raw GLB | 4.4MB | 907KB |
| triangles | 20,809 | 19,254 |
| vertices | 22,845 | 12,174 (welded ~2x better) |
| texture | large (bake squeezed it to 173KB WebP) | one 278KB JPEG |
| animation | via Meshy auto-rig + 678-clip library | none exposed via MCP |
The raw file is 4.8x smaller before bake-models.mjs even touches it, with
the same on-target face count and half the vertex data. Visual fidelity is
Chris's call — the model is at assets-src/incoming/models-tripo/ and a copy
went to Downloads for Windows 3D Viewer.
Verdict
Tripo H3.1 for static geometry (bosses' base meshes, props, showroom
subjects): a third of the credits for a cleaner, lighter mesh. Meshy stays
for motion: its auto-rig plus the 678-clip retarget library is what made
the boss walk/attack cycles, and the MCP's Tripo surface has no rigging. The
mixed pipeline costs one extra call — Meshy 3d_rigging accepts any GLB URL,
including a Tripo output.
Not investigated (would need Tripo's own account/API, not in scope): their quad remesh, smart low-poly and native auto-rig add-ons.
What Tripo does NOT change
- Swarm enemies stay primitives. 240-320 instanced enemies on a phone; the ink-outline pass doubles every mesh (inflate copy). A 20K-tri generated mesh per enemy type is 40K with outline before instancing — the primitive kit is ~200 tris and reads better under the toon ramp at gameplay camera distance. Generated meshes are for the boss/showroom tier only.
- The house look is applied in-engine. Whatever generator wins, its texture is a starting point at best; MeshToonMaterial + outline is the identity. Geometry quality-per-credit is the real comparison axis.
bake-models.mjsstays. Both vendors ship fat GLBs; the strip/squeeze pass is what makes them shippable.
Tripo API direct (2026-10-13)
Chris added a Tripo API key (~/.secrets/tripo-api-key.txt). Unlike the
Higgsfield route it reaches rigging and preset animation. The first trial
was Detention, which shipped with only Meshy's walk.
Pipeline (all three steps are in the repo):
node scripts/tripo-boss.mjs prep <boss> (the shipping mesh with its skin
removed, turned to +X, PNG texture) → python tools/tripo/tripo.py <boss> import | check | rig | anim walk,slash,hurt,fall | get → node scripts/tripo-boss.mjs bake <boss> ... into assets/ladder/ → reviewed on
/boss-rig.html beside the shipping rig, both through boss3d's real toon and
ink treatment. Task ids and raw downloads are in
../_hallpass-archive/tripo/.
Facts learned (credits are the Tripo account's own; 100 ≈ $1 per August notes):
| step | cost | note |
|---|---|---|
| import an external GLB | 50 | GLB upload goes through STS, so the SDK needs boto3 |
| prerig check | 0 | said riggable, biped |
| rig (Tripo skeleton, server picked v2.5) | 75 | 41 bones; mesh normalised to height 1, still facing +X |
rig with spec: 'mixamo' |
25-75 | 25 at completion, and 50 more left before the next call (unclear whether that was ours); every preset retarget on it then failed with error 1004, so use Tripo's own skeleton |
| retarget | 10 per clip | several clips in one task come back as one GLB |
Preset clips are generic (idle, walk, run, jump, slash, shoot, hurt, fall,
turn, dive, climb, plus walks for quadruped, hexapod, octopod, serpentine and
aquatic rigs). Clips come with root travel; boss-rig.js pins the channel
that travels furthest.
Verdict on Detention: fall is good (topples back, lies flat, 3.0s, an exorcism beat). Slash is a big overhead swing that would fit the cage throw, but the auto-skin tears the desk pieces at the raised shoulder and the clip idles for its back half (6.6s). Hurt is a 13.9s cower to the floor, not a flinch. The walk is stiffer and more generic than Meshy's Slow_Orc_Walk. From the gameplay camera the Tripo body also carries a heavier ink rim. A junk- furniture golem is the hardest case for auto-skinning, so the next fair test is a human-shaped boss (Parent, Monitor). The four shikigami are the case Tripo alone covers: quadruped and avian rigs, which Meshy's MCP surface does not offer.
Same day, follow-up: Tripo motion on the shipping skeleton. Meshy's own
clip library was the first choice for Detention's missing clips, but the
Higgsfield workspace now reads 0 credits on a free plan (the "Web Royal" team
workspace with 1,715 credits in September no longer lists), and there is no
Meshy key. So boss-rig.js retargets Tripo's slash, hurt and fall onto the
24-bone Meshy rig at load time: a bone-name map (Hip→Hips, Waist→Spine02,
Spine02→Spine, NeckTwist01→neck, L_Upperarm→LeftArm, L_Thigh→LeftUpLeg ...;
Tripo's twist bones are skipped), world-space rotation deltas from rest
turned from Tripo's +X front to +Z, and the hips' travel scaled by height.
retarget-character-clip.mjs cannot do this: it only re-bakes between binds
of the same skeleton. Result: the motion carries over closely, his own walk
stays, and Meshy's skin holds the raised arm better than Tripo's auto-skin
did.
Shipped 2026-10-15: Detention keeps his body, gains four clips. Chris
wanted his walk kept, with Tripo's walk as an occasional alternate and
Tripo's motion for the rest. Two bodies could carry that, and a frame-by-frame
check settled it: retargeted onto the Tripo rig, his walk's bones match the
original to the degree, but Tripo's auto-skin attaches the desk pieces
differently, so the same motion bends the body differently. Only his own
Meshy skin keeps the walk he knows. So the game loads his Meshy body with
Tripo's walk, slash, hurt and fall retargeted onto it
(node scripts/tripo-boss.mjs game detention, then
node scripts/pack-models.mjs detention). The Tripo-body set still bakes with
game detention tripo <dir> from the raw downloads in the archive. How the
clips map to the fight: docs/MECHANICS.md, "Detention's clips".
What the tooling learned:
src/rig-retarget.js(retargetClip) works between any two skeletons with a bone map: world-space rotation deltas from rest, a yaw between the two fronts, hip travel scaled by height. It runs in Node (on a three.js graph built from the glTF nodes) and in the browser. Withalign: trueit first turns each single-child bone so its rest direction matches the source's. This is what moves a clip between two different bodies that rest in different poses.scripts/tripo-boss.mjs share <from> <to> <clips>uses it, and every Meshy boss rig has the same 24 bone names.- Retargeted bones were checked in the browser against the source: same world rotation from bind, to the degree, at every sampled time.
scripts/pack-models.mjs <prefix>packs only matching files. A full run re-encodes every boss with whatever gltfpacknpxfetches that day.
If cost were no object, Claude's recommendation (2026-10-15): keep each boss's own Meshy body, but choose the clips from Meshy's 678-clip library rather than Tripo's 11 generic presets. That gives a true half-second hit reaction and a heavy death collapse at about 8 Higgsfield credits each, once the Higgsfield workspace is topped up. Keyframed or video-captured clips would cover the signature attacks. Either drops into the same file slots.
Same day: the hurt and fall reach every rigged boss, free. All seven
Meshy boss rigs share one 24-bone layout, so Detention's retargeted hurt and
fall were shared onto the other six with share (rests aligned, height
scaled), packed with pack-models.mjs <name>-hurt / -fall, and checked on
each body in /boss-rig.html?boss=<art>&solo=1 and in the game renderer.
Cost: nothing beyond the Detention trial.