comfy / hunyuan3D / shapeGen
Hunyuan3D's shape stage, no paint
- image_url
- model_air
- api_config
- model
- fbx_model
- thumbnail
- rigged_model
- rigged_fbx_model
- animated_model
- animated_fbx_model
- basic_animations
- workflow_id
- raw_json
Hunyuan3D isn't one model, it's two in a trenchcoat: a shape model that builds the geometry, then a paint model that skins it. Most people run both together and never notice the seam. shapeGen is the half that most people skip - it runs only the shape stage, and that's exactly what you want when you're going to control the texturing yourself.
What it is
This is the hosted comfy / hunyuan3D / shapeGen recipe from Civitai's official civitai/civitai-comfy-nodes pack, in the Civitai/Misc/comfy menu. Same family as the imageTo3D variant, same mechanism: your image goes up to the Civitai orchestration API, a cloud job reconstructs the geometry, and the result comes back as a native IMAGE thumbnail plus URLs to the meshes. Nothing runs on your GPU, and nothing downloads.
The difference from imageTo3D is the discriminator: shapeGen means "geometry only". You'll notice it in the schema - there's no should_texture toggle, because texturing isn't part of this job at all. It's the cheaper, faster, cleaner half of the pipeline, and the output is designed to be fed into something else.
When you'd reach for it
Three cases, roughly in order of how often people actually hit them:
- You want to texture elsewhere. Run shapeGen, take the resulting mesh, and run it through the hunyuan3D
texGennode (or your own local texturing pipeline) with a style you control. - You only need the geometry. Prototype, print, collision mesh, a placeholder for a layout - if the surface color doesn't matter, paying for the paint stage is waste.
- You want to iterate the shape cheaply. Geometry runs are cheaper than full textured runs, so shapeGen is the sensible thing to burn while you hunt the right silhouette.
The inputs
image_url is required - an IMAGE socket. After that:
model_version-v2,v2.1,v2-mini. v2.1 for the best open geometry.octree_resolution(16–512, default 256) andmesh_threshold(0–1, default 0.6) - the two knobs that actually shape the output. Higher octree means a finer voxel grid to extract the mesh from; the threshold decides how much of it survives extraction.enable_pbr- irrelevant to a bare geometry pass in practice, but it's there.steps,cfg_scale,sampler,scheduler,shift- the diffusion knobs for the shape model. Defaults are fine to start.prompt- a text hint; on a shape-only pass its job is nudging the geometry, not the paint.
The outputs
Same ten outputs as every polyGen node: model (a URL to the GLB mesh), fbx_model, thumbnail (IMAGE - wire it to a Preview Image), then the rigged/animated variants that only populate when the backend makes them, plus workflow_id and raw_json. For a bare shape pass, model + thumbnail is the whole story.
Installing and running it
It's part of the Civitai pack. In ComfyUI Manager search Civitai Comfy Nodes (publisher civitai) and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/civitai/civitai-comfy-nodes.git
pip install -r civitai-comfy-nodes/requirements.txt
Only requests and python-socketio get pulled in. You need a Civitai account with some Buzz; the node resolves credentials from a wired Civitai Auth node, CIVITAI_API_TOKEN, or the sidebar OAuth login.
The usual gotchas
- It's metered. Geometry-only is cheaper than full imageTo3D, but it's not free.
raw_jsonand the on-node cost line tell you what a run actually cost. - The mesh is URL-string, not a file.
modelpoints at a hosted GLB. Save it yourself if you want it local. - Still triangle soup. No shape stage in existence gives you production topology for free - if the mesh has to animate, budget for retopo by hand. That's the state of the whole field, hosted or not.
- If you wire this into a
texGennode afterward, keep the same image - the texture pass expects a consistent reference.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | — | |
| model_versionopt | COMBO | v2 | 3 options: v2, v2.1, v2-mini |
| model_airopt | CIVITAI_AIR | — | |
| stepsopt | INT | 11–150 | — |
| cfg_scaleopt | FLOAT | 0.000–30 | — |
| sampleropt | COMBO | euler | 18 options: euler, euler_ancestral, heun, heunpp2, dpm_2, dpm_2_ancestral, +12 |
| scheduleropt | COMBO | normal | 7 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +1 |
| resolutionopt | INT | 11–8192 | — |
| vae_num_chunksopt | INT | 80001000–500000 | — |
| octree_resolutionopt | INT | 25616–512 | — |
| mesh_thresholdopt | FLOAT | 0.600–1 | — |
| seedopt | INT | 00–4294967295 | — |
| shiftopt | FLOAT | 1.000–2147483647 | — |
| promptopt | STRING | — | |
| api_configopt | CIVITAI_CONFIG | Optional Civitai Auth connection; defaults to CIVITAI_API_TOKEN or stored OAuth login. |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| model | STRING | — |
| fbx_model | STRING | — |
| thumbnail | IMAGE | — |
| rigged_model | STRING | — |
| rigged_fbx_model | STRING | — |
| animated_model | STRING | — |
| animated_fbx_model | STRING | — |
| basic_animations | STRING | — |
| workflow_id | STRING | — |
| raw_json | STRING | — |