Load 3D Pixaroma
The mesh and a ControlNet-ready picture out of one node
- model_3d
- image
- mask
Most 3D nodes in ComfyUI are plumbing. Core's Load3D gets a mesh onto your screen and passes it along to whatever generates or saves it - useful, but if you want a picture of that mesh you're on your own. Load 3D Pixaroma does both from one node, and the picture is the interesting half: it renders your mesh as a depth or normal map, which is exactly the kind of thing a 2D generator will condition on.
So: you have a mesh from Hunyuan3D, TRELLIS, or a modelling tool, and you want that object in a second image - same angle, same silhouette. You don't re-run 3D generation and you don't reach for a depth estimator. Load the mesh, pick Depth, jump to 3/4, wire the image into a depth ControlNet or an edit model.
What the node hands back
One widget, three outputs. model_file is a dropdown of what it can see: GLB, GLTF, OBJ, FBX, STL and PLY files in ComfyUI's input/3d, plus anything in output/3d, tagged [output] so a mesh a 3D workflow just saved is ready to reuse. The Upload button drops new files into input/3d.
model_3d is that file itself, the FILE_3D type the core 3D nodes pass around - Save 3D, Preview 3D (Advanced), Get 3D Components, or this pack's 3D Builder if you want it in a composed scene. image is the picture, exactly as the frame on the node shows it. mask is white where the model is and black everywhere else, same size as the image.
Wire image and mask only if you need them: the node asks the browser for a picture only when one of those two is connected, so a model-only graph stays cheap.
How it works, and the one thing that will bite you
There's no 3D renderer in Python here, and no extra dependency - the pack's only requirement is imageio-ffmpeg, for its video nodes. The frame you see is three.js, vendored inside the pack and served locally (no CDN, no internet needed). When you press Run, a hook draws the model at the size you set, uploads that PNG into ComfyUI's temp folder, and hands the filename to Python, which loads it as an image tensor. The mask comes from the same pass.
Which means: the picture is drawn by your browser the moment you hit Run. Queue the workflow from an API client, or run it with the ComfyUI tab closed, and there is no picture to hand over. The node says so - "[Pixaroma] Load 3D: the picture of the model was not found" - rather than quietly passing a grey square down the wire. If nothing downstream reads image or mask, it doesn't matter at all.
The settings worth touching
Look gives you five renders: Color uses the model's own textures, Clay is plain grey so you see the shape without distraction, Wire shows the edges, and Normal and Depth are the conditioning maps - near white and far black for Depth, surface directions as colour for Normal. Views jumps the camera to Front, Back, Left, Right, Top or 3/4; you can also drag to orbit and scroll to zoom, and the bright frame is precisely the crop that comes out. The gear holds background colour, light rig, brightness, perspective or orthographic, which way is up (Y or Z, for a Z-up pipeline) and a quarter turn for a mesh facing the wrong way. The grid is node cosmetics only - it isn't in the exported picture.
One caveat: Depth pays off nearly everywhere. Normal maps are narrower ground - the unions stopped covering normals after the SDXL era, so Normal is really an SDXL or IC-Light move. And on an edit model you can skip the ControlNet entirely; it will take the depth render as an input image and follow it.
Install
ComfyUI Manager: search Pixaroma, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/pixaroma/ComfyUI-Pixaroma
The README's own manual step points at a GitLab mirror (gitlab.com/pixaroma/comfyui-pixaroma.git); either clone lands you in the same place. Restart ComfyUI afterwards.
No model downloads and no pip install for this node - meshes come from the Upload button or straight into ComfyUI/input/3d. The README's BiRefNet weights and optional rembg belong to Remove Background, not here.
When it breaks
- No picture on a headless run. Covered above; run it from the ComfyUI page with the tab open.
- The node looks blank or half-drawn after an update. Almost always browser cache: hard-refresh with
Ctrl+Shift+R(Cmd+Shift+Ron Mac). - "was not found in input/3d or output/3d". The dropdown is built from a folder listing, so files copied in by hand need a page refresh, and the extension has to be one of the six.
- The model renders untextured grey. OBJ and GLTF assets often ship as a folder - bring the
.mtland texture files along. - "WebGL is not available in this browser". Hardware acceleration is off, or you're on a locked-down remote session.
It's a small node, but if you do any 3D-to-2D work it quietly deletes a whole depth-estimation detour from your graph.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| model_file | COMBO | The 3D model to load. Models in input/3d and output/3d are listed; the Upload button on the node adds new ones. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| model_3d | FILE_3D | The 3D model file itself, for 3D workflows: Save 3D, Preview 3D (Advanced), or Get 3D Components to edit the mesh. |
| image | IMAGE | A picture of the model exactly as the frame on the node shows it, at the width and height you set, in the look you picked. |
| mask | MASK | White where the model is and black everywhere else, the same size as the image. |