Nodes/ComfyUI-Lux3D/Lux3D Image to 3D
ComfyUI Node

Lux3D Image to 3D

1–8 photos in, a GLB out, and zero CUDA wheels to fight

By manycore-research·Created 7 months ago·Updated 2 days ago· 120
Lux3D Image to 3D
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • image_7
  • image_8
  • task_id
  • lux3d_zip
  • glb
  • ply
base_api_pathhttps://api.aholo3d.cn
versionG1-Turbo
face_count200000
output_formatdefault
enable_pbrdefault
ai_predict_sizedefault

This is the node the whole pack is built around. You drop in one to eight images of an object, and it returns a textured 3D model - as a .glb mesh, a .ply gaussian splat, or both - without you installing a single compiled CUDA extension.

That last part is the whole point. Local 3D generation in ComfyUI usually means ComfyUI-3D-Pack, and 3D-Pack is the rare case where "install this pack" costs you an evening: it wants pointnet2_ops, diff-gaussian-rasterization, and friends compiled against your exact PyTorch build. Lux3D Image to 3D skips that entirely by being an API node. The model lives on Lux3D's servers (from Manycore Tech, the Hangzhou outfit behind the Aholo 3D tools), so the only real dependencies are requests, Pillow, and numpy - and the only setup is one environment-variable API key. For "I want to try image-to-3D once without losing an evening to CUDA wheels," this is exactly the move.

How it works

Under the hood it's a thin client for Lux3D's OpenAPI. You fill the image slots, the node classifies each one - a public URL, a STRING URL from upstream, or a real ComfyUI IMAGE - and any local image gets uploaded to Lux3D's asset service first. Then it POSTs to /lux3d/v1/generate/img-to-3d/task/create and polls task/get every 15 seconds for up to about 15 minutes until the job finishes. All four outputs are plain strings, and they're URLs, not files on your disk.

The inputs that matter

Eight image slots is the headline feature. You can mix sources freely: image_1 a local IMAGE from a Load Image node, image_2 a public URL pasted into the widget, image_3 a URL coming off another node. At least one must be filled, and each slot takes exactly one image. Fewer is usually fine for clean, hard-surface objects; multiple angles help with complicated ones.

  • version - G1 or G1-Turbo, default G1-Turbo. Turbo is the fast one; G1 is the full version. They differ on output rules (see below).
  • face_count - target triangle count, default 200,000. Set 0 to leave it to the server; otherwise it must be between 10,000 and 300,000. More faces = crisper detail, bigger file.
  • output_format - default, zip, glb, ply, or comma combos. One gotcha that burns people: G1 always returns ZIP + GLB and only optionally adds PLY, while G1-Turbo respects whatever combination you pick.
  • enable_pbr - true/false/default, and it's G1-Turbo only. PBR means metalness/roughness material channels instead of one baked texture - worth switching on if a game engine or Blender is the destination.
  • ai_predict_size - lets the service guess the right scale so the model comes out with sane real-world-ish dimensions.

The output sockets are task_id, lux3d_zip, glb, and ply. Wire the non-empty glb or ply into Lux3D Viewer to see it in the canvas. A format you didn't request comes back as an empty string - that's not a bug, it's the node telling you the server never made it.

Install

# ComfyUI Manager: Manager → Custom Nodes → Install via URL
# https://github.com/manycore-research/ComfyUI-Lux3D.git
# or the CLI:
comfy node install lux3d
# or manually:
cd path/to/ComfyUI/custom_nodes
git clone https://github.com/manycore-research/ComfyUI-Lux3D.git
pip install -r requirements.txt

Grab a key at https://labs.aholo3d.cn/api-keys (China service) or https://labs.aholo3d.com/api-keys (international), then export it in the environment that starts ComfyUI - the China endpoint reads LUX3D_API_KEY_CN, the international one reads LUX3D_API_KEY_INTL:

export LUX3D_API_KEY_CN="your_key_here"

Where people get burned

The China endpoint is the default, so if you got an international key, switch base_api_path to https://api.aholo3d.com - and whatever you do, no trailing slash, or the client rejects it. No key set → the node errors out telling you exactly which env var is missing. And the usual honesty check for this corner of the field: image-to-3D meshes look great at a glance, but the geometry is triangle soup, not clean artist topology. Static props, background filler, product shots, 3D printing - great. Anything you need to rig and animate - budget for a retopo pass. Also remember this is metered cloud compute, so every run costs something; treat it as the tool for when local 3D isn't worth the install fight.

CategoryLux3D/Generate

Inputs (14)

NameTypeDefaultDescription
base_api_pathSTRINGhttps://api.aholo3d.cnUse https://api.aholo3d.cn or https://api.aholo3d.com. The matching server API key environment variable is used.
image_1STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 1.
image_2STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 2.
image_3STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 3.
image_4STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 4.
image_5STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 5.
image_6STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 6.
image_7STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 7.
image_8STRING,IMAGEOptional public image URL or connected IMAGE/STRING for slot 8.
versionCOMBOG1-Turbo2 options: G1, G1-Turbo
face_countINT2000000–300000Defaults to 200000; use 0 to omit the field.
output_formatCOMBOdefaultG1 always returns ZIP + GLB and optionally PLY; G1-Turbo follows the selected combination.
enable_pbrCOMBOdefaultG1-Turbo only; omit for PLY-only output.
ai_predict_sizeCOMBOdefault3 options: default, true, false

Outputs (4)

NameTypeDescription
task_idSTRING
lux3d_zipSTRING
glbSTRING
plySTRING