Nodes/MKRShift_Nodes/AngleShift Director
ComfyUI Node

AngleShift Director

Turnaround shots for characters, without retraining anything

By criskb·Created 7 months ago·Updated 5 months ago· 0
AngleShift Director
  • image
  • angle_string
  • angles_12_string
  • shifted_image
  • angles_12_batch
  • angles_12_sheet
  • metadata_json
settings_json{}
strength0.85
background_modeblur
sheet_columns4
label_overlaytrue
generate_12_viewsfalse

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 view
  • shifted_image - the warped result
  • angles_12_string, angles_12_batch, angles_12_sheet - the multi-view variants
  • metadata_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.

CategoryMKRShift Nodes/Core/Camera

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{}
strengthoptFLOAT0.850–1.5
background_modeoptCOMBOblur4 options: black, blur, gray, white
sheet_columnsoptINT43–6
label_overlayoptBOOLEANtrue
generate_12_viewsoptBOOLEANfalse

Outputs (6)

NameTypeDescription
angle_stringSTRING
angles_12_stringSTRING
shifted_imageIMAGE
angles_12_batchIMAGE
angles_12_sheetIMAGE
metadata_jsonSTRING