Qwen Multiangle Lightning
Drag a light around in 3D and get a Qwen relight prompt you don't have to wordsmith
- image
- lighting_prompt
The pitch: a lighting console, not a model
First, the most important thing: this node does not run Qwen anything. No model downloads, no API, no key. It's a prompt writer - you fiddle with lights in a little Three.js 3D viewport (or just the sliders) and it hands you a finished relighting prompt formatted for Qwen-Image-Edit. You wire that prompt into your actual Qwen Image Edit workflow and the model does the relighting. That division of labor is the whole point: Qwen-Edit-2511 folded the community's relight LoRA into the base weights, so "just describe the light" works great - but describing "intense #FF6B35 from the front-right, high angle, cinematic" consistently, in prompt-speak, every single time is exactly the kind of thing you shouldn't be typing. This node makes the description deterministic.
It's a rework of jtydhr88's earlier ComfyUI-qwenmultiangle by two authors (aiwood and wallen), MIT licensed, and it's young enough that there's no community footprint behind it yet. Judge it on the code, which is small and honest.
How it works
Under the hood it's a pure string assembler. Your azimuth (0–360°) gets bucketed into an 8-sector direction phrase (front, front-right, right, …). Elevation (−90° to 90°) maps to a height phrase (uplighting, low-angle, horizontal, high-angle, overhead top-down). Intensity becomes soft / bright / intense. It slaps a "SCENE LOCK, FIXED VIEWPOINT, maintaining character consistency and pose. RELIGHTING ONLY:" prefix on the front and appends "cinematic relighting" when cinematic mode is on. No LLM in the loop - the same inputs always produce the same sentence, which is what you want when you're comparing lighting takes.
The 3D viewport is a Three.js scene (loaded from a CDN, more on that below) with drag handles for azimuth, elevation and intensity, plus a real-time color picker and a preview of your input image floating on a card in the scene. Sliders and handles sync both ways. There's also a tab bar for multiple light configurations, which is where this earns its keep: each tab becomes its own prompt, and the node outputs a list of them.
The inputs and output that matter
light_azimuth(0–360) andlight_elevation(−90 to 90) - where the light sits relative to the subject. These two do 80% of the work.light_intensity(0–10) - below 3 is "soft", above 7 is "intense".light_color_hex- the light's color, default#FFFFFF, with a live preview swatch on the node.cinematic_mode(on by default) - appends "cinematic relighting" to the prompt and generally reads punchier.image(optional) - only used for the 3D preview; it's not passed to the model.
The single output, lighting_prompt, is a STRING list (one entry per light tab). Wire it into the text input of your Qwen Image Edit encoder - the shipped example workflow feeds multiple of these nodes into easy promptList from ComfyUI-Easy-Use, then into TextEncodeQwenImageEditPlus. Because it's a list, a plain single-string input may need a join/list node in between.
Installing it
Easiest via ComfyUI Manager - search for qwenmultianglelight. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/wallen0322/ComfyUI-qwenmultianglelight
Then restart ComfyUI. No requirements.txt, no weights, nothing heavy - the node itself is numpy + PIL, both already in ComfyUI. The heavy lifting lives downstream: the Qwen-Image-Edit workflow it feeds needs the ~bf16 2511 checkpoint plus the Qwen2.5-VL CLIP (people run them GGUF/fp8 quantized on consumer cards).
Where people get burned
- Blank 3D viewport? The Three.js scene is fetched from a CDN on load. No internet, no viewport - the sliders still work, but the drag-and-drop magic won't show. This is the one dependency nobody mentions in the README.
- Nothing changes when you run it. You forgot the model half. This node only writes text; if it isn't connected into a Qwen Image Edit sampling chain, you've built a very pretty prompt box.
- The README's own clone command has a placeholder URL (
github.com/your-repo/...) - use the real repo path above or Manager, not the copy-paste. - It won't hold pixels it shouldn't touch. Qwen-Image-Edit re-emits the whole frame, and the "SCENE LOCK" phrasing helps a lot but doesn't make identity drift disappear. If you're re-lighting a product catalog where stitching and label text must stay byte-identical, the frozen-but-correct answer is still IC-Light. For character art and creative shots, this is the modern route.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| light_azimuth | INT | 00–360 | — |
| light_elevation | INT | 30-90–90 | — |
| light_intensity | FLOAT | 5.00–10 | — |
| light_color_hex | STRING | #FFFFFF | — |
| cinematic_mode | BOOLEAN | true | — |
| imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| lighting_prompt | STRING | — |