AngleShift Director
Turnaround shots for characters, without retraining anything
- image
- angle_string
- angles_12_string
- shifted_image
- angles_12_batch
- angles_12_sheet
- metadata_json
If you do character work in ComfyUI you know the grind: you get one good angle of a character, and then you fight the model to produce the other views - and every attempt drifts the identity. AngleShift Director takes a different route. Instead of re-rolling generations, it takes the image you already like and physically warps it with a perspective transform to fake a camera moving around the subject. The name is a little grandiose for what's underneath, but the output is genuinely useful: a pseudo-3D angle change you can then re-prompt from.
It ships in MKRShift Nodes, Cris K B's production-focused pack, and unlike most of the "camera" tooling out there it needs no 3D models, no depth maps, no ControlNet. It's just image math plus a frontend extension for the nicer UI.
How it works
Under the hood it's a single PIL PERSPECTIVE transform: the four corners of your image get projected to a new quadrilateral based on rotation, tilt, and zoom, and the result is warped back with bicubic resampling. Whatever that warp exposes around the edges gets filled by background_mode - default is a blur of the source, which reads as a shallow depth-of-field backdrop and hides the warp seams way better than a flat color.
The strength input (0 to 1.5, default 0.85) controls how far the corners actually move, so you can dial a subtle nudge or an aggressive swing. There's also a settings_json multiline input that can override everything via JSON - the source parses nested angle, camera, light, and gizmos keys from it. Most people never touch it; the sliders do the job.
The genuinely clever bit is the text output. Alongside the warped image, angle_string spits out a ready-to-paste prompt fragment describing the new view - facing direction, elevation, framing, and an estimated lens focal length, like AngleShift: rotation=30deg, tilt=-30deg, zoom=0.00 | front-right, three-quarter, close, lens 50mm. That's the part that keeps your character consistent: feed the warped image and this phrase back into an img2img pass and the model has a strong anchor for "this is the same person, from this angle."
The 12-view mode
Flip generate_12_views and the node renders twelve rotation steps (0° through 330°) as a batch plus a labeled contact sheet (angles_12_sheet) so you get an instant turnaround board. sheet_columns (3–6) and label_overlay control the sheet layout. angles_12_batch gives you the individual frames to feed into a save or comparison node.
Outputs at a glance
angle_string- the prompt fragment for the single shifted viewshifted_image- the warped resultangles_12_string,angles_12_batch,angles_12_sheet- the multi-view variantsmetadata_json- full settings, warp quad, and facing/elevation labels, handy for logging
Installation
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI, or just search "MKRShift Nodes" in ComfyUI Manager. No models to download, no pip requirements - the pack's optional comfy_api dependency only matters for its V3-schema lane, which this node doesn't need.
Common issues
The honest caveat: this is a 2D warp, not a real camera. Turn the corner of a face far enough and you get perspective smearing, and geometry the warp can't know about (the back of a head, the far side of a chair) simply isn't there to reveal. It excels at moderate swings and at locking in prompt language for angle consistency - it won't give you a true 3D turnaround. If blur background leaves the wrong feel, black/gray/white are one dropdown away. And if the settings_json you pasted from an old workflow silently does nothing, check that it's actually valid JSON - the parser swallows parse failures and just falls back to the sliders.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {} | — |
| strengthopt | FLOAT | 0.850–1.5 | — |
| background_modeopt | COMBO | blur | 4 options: black, blur, gray, white |
| sheet_columnsopt | INT | 43–6 | — |
| label_overlayopt | BOOLEAN | true | — |
| generate_12_viewsopt | BOOLEAN | false | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| angle_string | STRING | — |
| angles_12_string | STRING | — |
| shifted_image | IMAGE | — |
| angles_12_batch | IMAGE | — |
| angles_12_sheet | IMAGE | — |
| metadata_json | STRING | — |