☁️BizyAir Metric3D Normal Map
Surface-orientation maps from a metric-scale depth model
- image
- IMAGE
A normal map and a depth map answer related but different questions. Depth tells you how far away each pixel is; a normal map tells you which direction each surface faces. The two aren't independent, a normal map can be computed from a depth map's gradients, and that's essentially what this node does: it runs Metric3D's geometry estimation and derives surface orientation from it, rather than depth values directly.
Why this one specifically, over the pack's MiDaS normal map node
BizyAir ships two normal-map preprocessors, this Metric3D one and a MiDaS-based one. The difference traces back to the same distinction that separates their respective depth nodes: Metric3D estimates real, metric-scale 3D geometry (which is why it needs camera intrinsics), while MiDaS produces relative depth and derives its normals from that. In practice, a normal map computed from genuinely metric geometry tends to be more internally consistent, less prone to the subtle warping you can get deriving surface direction from a relative-only depth signal, particularly on scenes with real depth variation rather than a mostly-flat subject against a background.
Inputs worth knowing
backbone picks the underlying model size: vit-small for speed, vit-large or the top-end vit-giant2 when quality matters more than turnaround. fx and fy (both default 1000) are the camera's focal length in pixels, Metric3D needs these to properly scale its geometry estimate, since without them there's no way to correctly recover metric distances or the surface angles that follow from them. Getting the exact camera parameters right matters less for ControlNet purposes than it sounds, the defaults are a reasonable stand-in when you don't know the real capture settings. resolution is the usual preprocessing-size control, default 512, worth raising if your final output resolution is large.
Output is a single IMAGE, the normal map, encoded the way ControlNet normal-conditioning models expect it (surface direction mapped to RGB channels).
Where it fits
Normal maps are a narrower-use ControlNet condition than depth or lineart, they matter most where surface orientation genuinely drives the look you're after: renders that need to read as having real material and lighting response, texture and relief work, or any pipeline downstream that treats the output as lighting-relevant geometry rather than just composition. Note that normal-map ControlNet support has narrowed considerably on newer base models, it's a strong SD 1.5/SDXL-era condition (SDXL's union model still covers it) but hasn't been rebuilt for most 2025-26 architectures, so check that whatever ControlNet checkpoint you're loading downstream actually supports a normal-map input before building around this preprocessor.
Installing it
Through ComfyUI Manager: search "BizyAir", install, restart. Or clone directly:
cd ComfyUI/custom_nodes && git clone https://github.com/siliconflow/BizyAir.git
You'll need a BizyAir/SiliconFlow API key set up before this runs, via the "click to login" prompt on first use. Signup involves phone-number verification, and some users outside China have reported friction getting that step to accept a non-Chinese number.
Common issues
If the normal map looks flat or the downstream ControlNet doesn't seem to be doing much, the most likely cause isn't this preprocessor, it's that your ControlNet checkpoint doesn't actually support a normal-map condition for your base architecture; normal-map coverage is genuinely thin outside SD 1.5/SDXL. As with every node in this pack, a run that just doesn't execute almost always traces back to the API key rather than a workflow problem.
Separately, unrelated to this node specifically: ComfyUI Manager sometimes auto-installs the whole BizyAir pack when it misresolves an unrelated missing-node error on an older shared workflow. It's legitimate software, not malware, and removable through the Manager if you didn't intend to install it.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| backboneopt | COMBO | vit-small | 3 options: vit-small, vit-large, vit-giant2 |
| fxopt | INT | 10001–1024 | — |
| fyopt | INT | 10001–1024 | — |
| resolutionopt | INT | 51264–1024 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |