TS Angle Select
Point the camera, get the prompt for that exact view
- prompt
Re-angling an image with Qwen-Image-Edit and the Multiple-Angles LoRA is a great trick with one awful part: you have to type the angle prompt yourself, and it's a specific trigger phrase - get the words wrong and the model just ignores you. TS Angle Select is the visual interface for that. It shows a small 3D preview of a subject with a camera orbiting it, and three sliders - rotation, height, and zoom - that move the camera. Move the camera, and the node emits the prompt that asks the model for exactly that view.
The model-specific wording is the whole point, and the README is blunt about why it works the way it does. With the bundled Qwen Multi-Angle preset, the output is the trigger phrase the LoRA was trained on: <sks> back view elevated shot close-up - nothing else. It reads like a fragment because it is one. The LoRA learned these exact words; prettier English breaks the conditioning, and the <sks> token has to be there.
How it works
You get eight rotations (45° apart - the buckets the model was trained on, so positions in between get snapped to the nearest one), four heights (low / eye-level / elevated / high), and three framings (wide / medium / close-up). Those aren't arbitrary limits: there's no phrase for a 22° angle, because nothing was trained on it. The 3D preview updates live as you drag, and the node deliberately keeps widgets from resizing with values so it never shifts under your cursor.
Presets are plain JSON files in nodes/text/angle_presets - one per model. The preset defines the template and which phrase belongs to each camera position, so supporting a new model is a new file, not a code change. A preset missing a phrase is skipped with a log line rather than quietly producing a hole.
The inputs and output
preset- which model's vocabulary to speak. Default isQwen Multi-Angle.azimuth- camera position in degrees, 0 (front) to 315, in 45° steps.height- low / eye-level / elevated / high.framing- wide / medium / close-up.
Output: prompt - a STRING. Feed it to the text encoder on its own for a pure re-angle, or join it with your own description of the subject (the README's framing: "on its own for a pure re-angle, or joined with your own description").
Installing it
Part of comfyui-timesaver (ComfyUI Manager → "Timesaver", or manual clone + pip install -r requirements.txt + restart). The three.js used for the preview ships with the pack and only loads when this node appears - ComfyUI imports every script in the web folder on page load, so the author deliberately keeps it out of there.
Where people get burned
The trap is "improving" the output. The phrase looks like a sentence fragment and your instinct is to polish it into proper English - don't. The LoRA was trained on these exact words next to the node that emits them; rewriting is how you get a model that ignores the angle entirely. The other gotcha is expecting fine-grained control: there's nothing between the eight rotations. If the preview shows the camera between two positions, that's the node showing you where you will snap to, not a promise of a middle phrase. And if you're building a turnaround animation, that's exactly the intended use - step through the eight rotations and you get a consistent view series with no prompt-typing.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| preset | COMBO | Qwen Multi-Angle | Which model's vocabulary to speak. • Qwen Multi-Angle — Qwen-Image-Edit with the Multiple-Angles LoRA. The wording is the LoRA's trigger phrase, not a description: it was trained on these exact words, and the '<sks>' token has to be there. Presets are plain JSON in nodes/text/angle_presets — a new model is a new file, not a code change. |
| azimuth | INT | 00–315 | Where the camera stands, in degrees around the subject. 0 is in front, 90 is the subject's right, 180 is behind. Eight positions, 45 degrees apart — the same eight the model was trained on. Anything in between is snapped to the nearest one, because a phrase for it does not exist. |
| height | COMBO | eye-level | How high the camera sits. • low — below the subject, looking up. • eye-level (default) — level with the subject. • elevated — a little above, looking slightly down. • high — well above the subject, looking down. |
| framing | COMBO | medium | How much of the subject is in frame. • wide — the whole subject and its surroundings. • medium (default) — roughly waist up. • close-up — head and shoulders. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | The camera-angle prompt. Feed it to the text encoder — on its own for a pure re-angle, or joined with your own description. |