AutoRemesher (quad)
Your AI Mesh Is Triangle Soup — AutoRemesher (quad) Puts Quads Back On It
- glb_path
The problem this node exists for
Every open image-to-3D model - Hunyuan3D, TRELLIS, TripoSR, the whole zoo - hands you the same thing: a good silhouette wrapped around geometry nobody wants to work with. The field's standing verdict, from the Hunyuan3D 2.0 launch thread and never overturned since: "topology is still terrible for any sort of skeletal animation, but they seem good for static meshes." No edge loops, just triangles scattered by a marching-cubes pass rather than laid out by a human.
Two honest answers. Accept it and print the thing - a slicer wants watertight, not topology, hence the field's shrug: "Just remesh that shit." Or re-lay the surface, keeping the shape and replacing the topology with quads that flow along the form.
AutoRemesher (in the node menu as AutoRemesher (quad), category melite/mesh) is the second one, wired into the graph. Give it a GLB, get a GLB back with quad edge flow. It won't fix your UVs and it isn't a retopo artist in a box - but it's the difference between a mesh you open in Blender and wince at, and one you can start building on.
The two knobs that matter
glb_path is a string path, not a MESH socket - which makes this a terminal node rather than a link in a 3D chain. Point it at a .glb that something already wrote, and wire nothing into it. You can't feed it a live mesh.
target_quads is your polygon budget, an INT from 0 to 200,000 (tooltip: 0 = use the preset budget). Which brings us to preset, six budget classes: rock 5K, prop 10K, large_prop 20K, creature 20K, complex_creature 50K, hero 80K. The chain is explicit > preset > defaults, and nothing resolves silently - if no budget arrives, the node raises instead of guessing.
Here's the trap, straight from the shipped code: the preset YAMLs put target_quads at the top level, but load_presets() reads it out of a params: block that isn't there. Every preset loads empty, so target_quads = 0 fails loudly with no target_quads … silent defaults are banned. Until the YAMLs are nested properly, set target_quads by hand - 5K for a rock, 20–50K for a creature - and treat the preset dropdown as a label.
filename_prefix defaults to autoremesher/remeshed, so results land in output/autoremesher/ and count up. The one output is glb_path - a STRING path, useful to any downstream node that takes a path, and not something you can hand to the native 3D preview nodes.
Four optional floats - edge_scaling (0–4), sharp_edge (0–180), adaptivity (0–2), anisotropy (0–4) - pass to the CLI. At 0 they fall back to the built-in defaults; the two worth touching are sharp_edge, the crease angle to preserve on a hard-surface prop, and adaptivity, which lets quad density follow the detail.
What's actually running
This pack vendors the huxingyi/autoremesher CLI as a pinned release binary, and the node is a thin wrapper: trimesh converts your GLB to OBJ in-process, the binary runs as a subprocess with QT_QPA_PLATFORM=offscreen (a bad remesh can only fail the node, never your ComfyUI process), and trimesh reads the OBJ back and writes the GLB.
Installing it
The easy door: ComfyUI Manager → search the pack title → install → restart. The manual door is the usual cd ComfyUI/custom_nodes && git clone https://github.com/JayDataEngineer/melite-autoremesher-nodes, then python install.py inside the pack folder before restarting.
install.py is the part worth knowing: it downloads one sha256-pinned release asset into the pack's native/ directory, marks it executable, and refuses a hash mismatch. The Python deps are just trimesh and pyyaml - no CUDA build, no compiled extensions. In a corner of the ecosystem where ComfyUI-3D-Pack's pointnet2_ops-class extensions must compile against your exact torch and CUDA, that's a very good look.
When it goes wrong
autoremesher binary not found-install.pynever ran, or the download failed. Re-run the Manager install, or build the CLI and pointAUTOREMESHER_BINat it. You'll see this when you add the node: the check runs while the node builds its input schema.no target_quads … silent defaults are banned- you lefttarget_quadsat 0 and the preset was empty, per the bug above. Type a number.- A raw
TimeoutExpired- the CLI runs under a fixed two-minute subprocess timeout that isn't exposed as a widget, and it fails without a friendly message. - Your quads came back as triangles. GLB is triangles-only and the OBJ is triangulated on export. The quad edge flow survives - that's the part that matters - but use Tris to Quads in Blender if you want faces too.
- A multi-object GLB got welded into one mesh. The loader forces a single mesh, so a scene with several parts is merged before remeshing. One object per file.
What it won't do
It won't re-unwrap your UVs, and it won't turn a generated blob into a production hero asset. Retopo, re-UV and rigging are where the time goes; a remesher shaves the first of those three. What it gives you is a mesh whose wires run with the shape instead of across it - the thing you were missing.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| glb_path | STRING | — | |
| preset | COMBO | 6 options: complex_creature, creature, hero, large_prop, prop, rock | |
| target_quads | INT | 00–200000 | 0 = use the preset budget |
| filename_prefix | STRING | autoremesher/remeshed | — |
| edge_scalingopt | FLOAT | 0.000–4 | 0 = preset default |
| sharp_edgeopt | FLOAT | 0.000–180 | — |
| adaptivityopt | FLOAT | 0.000–2 | — |
| anisotropyopt | FLOAT | 0.000–4 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| glb_path | STRING | — |