Qwen Image Multiple Angles (96 poses)
96 camera poses for 2.5 cents, no LoRA, no 20B download
- reference_images
- client
- image
Give it one to three pictures of a subject, pick an angle from three dropdowns, and it re-renders that subject as if the camera had walked around it. Front, side, back, above, closer, wider. It's the turnaround sheet, minus the turnaround sheet.
That matters more than it sounds. Turnaround sheets are the old character-consistency trick - generate front/side/back together so a shared latent context keeps the character honest, then feed the sheet downstream as a reference or a LoRA training set. The way people do it in 2026 is to prompt an edit model - usually Qwen-Image-Edit locally with a "multiple angles" LoRA on top. You'll see dx8152/Qwen-Edit-2509-Multiple-angles and the 2511 version from fal cited in half the workflows that need a back view.
This node is that capability as a hosted endpoint. The practical difference: it works on an 8GB card, or no card, and there's no 20B checkpoint, no LoRA loading, no VAE/encoder hunt. If you've been reading threads from people at q4 GGUF who can't tell whether adding the angles LoRA will even fit, this sidesteps the entire question. Per image it's $0.025, which means a full 96-pose sweep of one subject runs about $2.40.
How it works
The node sends your references and three numbers to WaveSpeed's qwen-image/edit-multiple-angles endpoint and polls until the render lands, then converts the result to a ComfyUI IMAGE tensor. The interesting part is the numbers: the server snaps any angle to its nearest trained pose, so the API only accepts discrete values, and the dropdowns are literally those values. Eight azimuths (0° through 315° in 45° steps), four elevations (−30°, 0°, 30°, 60°), three distances. Eight times four times three is your 96. There is no "17 degrees" and no "slightly more from behind" - you get the pose grid the model was trained on.
The inputs that matter
There is nothing required, which is a little misleading, because you can't actually run it bare.
reference_images is your subject as a ComfyUI IMAGE batch, up to 3 slices, sent inline as base64 so you don't need an upload step. reference_images_url is the alternative - up to 3 URLs separated by commas or newlines - and it's ignored the moment anything is connected to the IMAGE socket. Connect neither and you get a clean Connect reference_images or enter at least one image URL error rather than a wasted call.
azimuth (front (0°) by default), elevation (eye level (0°)), and framing (medium) are the pose. Know the elevations going in: the range is low angle at −30° up to 60°, so there's no true top-down or worm's-eye shot in this grid.
prompt is optional and is not a full instruction - it's guidance appended to the camera-angle prompt the node builds. Use it to protect things the pose change tends to break ("same jacket, same scar on the left cheek"), not to try to re-stage the scene. output_format is jpeg / png / webp, and seed is a real generation seed. client is optional; leave it unwired and the key comes from ComfyUI Settings, then the node input, then config.ini.
Output is a single image.
Install
ComfyUI Manager: search erpk and install ERPK Custom Nodes, then restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/eRepublik-Labs/comfyui-nodes-erpk.git erpk
cd erpk && pip install -r requirements.txt
Nothing heavy: requests, Pillow, pydantic, urllib3, cryptography, plus SDKs for the pack's Claude/Gemini/OpenAI/Grok integrations. Zero model downloads - the weights live on WaveSpeed's side, which is the reason this node exists. Add the API key under right-click → ERPK Settings → API Keys.
Where people get burned
The honest limitation is orientation, and it's the model's, not the node's. It re-renders a subject from a camera position; it does not know which side of your object is the front. Props and asymmetric objects are where that shows up - the classic complaint from people building turnaround workflows is that the model picks its own idea of "front" and the teapot ends up mirrored. Fix it by feeding a reference that's unambiguous about orientation, and check the 180° pose before you spend on the ones either side of it.
Second: this is a re-render, not a rig. Identity holds well for faces and characters, less well for fine detail, and each pose is an independent generation - a set of six angles from the same reference will be six slightly different interpretations. Setting a fixed seed at least makes your own re-rolls reproducible and lets ComfyUI serve cached output instead of re-billing you on an unchanged queue. Which is the last gotcha, and it's the expensive one: leave the seed at -1 and every queue is a fresh, freshly-charged call.
Pose-wise, this doesn't replace what adapters do - IP-Adapter and PuLID condition on identity, not viewpoint. Where they keep a face steady through unrelated scenes, this one answers "show me the same character from behind".
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| reference_imagesopt | IMAGE | Reference images as a ComfyUI IMAGE batch, up to 3. Each slice is one image. Takes precedence over `reference_images_url`. Sent inline as base64, no upload. | |
| reference_images_urlopt | STRING | Reference image URLs, up to 3, separated by commas or newlines. Ignored when `reference_images` is connected. | |
| promptopt | STRING | Optional guidance appended to the camera-angle prompt | |
| clientopt | WAVESPEED_AI_API_CLIENT | WaveSpeed API client (optional if API key is configured in Settings) | |
| azimuthopt | COMBO | front (0°) | Camera position around the subject; 0° is the front view |
| elevationopt | COMBO | eye level (0°) | Camera height relative to the subject |
| framingopt | COMBO | medium | Camera distance: close-up, medium or wide shot |
| seedopt | INT | -1-1–2147483647 | Generation seed, sent to the API. A fixed seed reproduces the same result and lets ComfyUI reuse the cached output; -1 generates a new one each queue. |
| output_formatopt | COMBO | jpeg | Output image format. $0.025 per image. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |