π Z2J Camera Angle
Naming the camera is the highest-leverage phrase β Z2J Camera Angle automates it
- text
There's a line in the community's own research that says naming a physical camera is the highest-leverage phrase you can type. Not a buzzword, a real shot description - and Z2J Camera Angle is the ComfyUI-Zero2JSON node that writes those for you. It composes a vertical angle, a horizontal angle, a movement and a perspective into one deterministic sentence: "low angle looking up, over-the-shoulder, smooth tracking, wide-angle distortion." That's not a tag salad; that's a camera direction a DP would recognize.
It's the angle member of the camera family in the pack, feeding the FLUX2_CameraRig's angle input in the FLUX2-JSON workflow. It pairs with Z2J Camera Distance (how far), Z2J Camera DoF (how much is sharp) and Z2J Camera Focus (what the eye lands on). Together they turn "shot" from a vibe into a set of reproducible numbers.
How it works
Standard position-as-seed: (seed, prompt_index, slot) hashed with xxhash32, hash picks a template and one option per pool. The camera_angle_default.json profile has 4 templates over four pools - vertical_angle (9), horizontal_angle (6), movement (9), perspective (9) - about 17,500 combinations. Vertical runs from eye level to worm's-eye, horizontal from straight-on to POV, movement from locked-off to dolly push, perspective from natural to fisheye.
The inputs that matter
seed- world seed.prompt_index- position coordinate; bump to walk the shot space.profile- dropdown ofcamera_angle_*.jsonfiles; custom profiles appear after restart.prefix/suffix- anchors around the angle phrase.angle_type- a filter dropdown (eye_level / high / low / birds_eye / worms_eye / dutch). Fine print: in v1.0.0 as shipped this is declared but ignored by the generator. It doesn't constrain the output yet. Check for a newer release.
Output is a single text string.
Install
All seventeen nodes, one repo:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/ComfyUI-Zero2JSON
cd ComfyUI-Zero2JSON
pip install -r requirements.txt
Restart ComfyUI. Only dependency: xxhash>=3.0.0 - no models, no keys. Manager users: search "ComfyUI-Zero2JSON".
Where people get burned
Angle words are positional and therefore absolute: "bird's eye view" and "worm's eye view" in the same prompt are mutually exclusive, and the model will render whichever is louder. Pick one angle node per shot and don't fight it from the scene or subject-position nodes. Also be aware that a strong camera phrase can dwarf a weak subject description - if you generate a dramatic low angle but the subject is vaguely described, you get a dramatic angle of something. Order your prompt so the subject lands before the camera tells it how to be seen.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00β4294967295 | World seed for deterministic generation |
| prompt_index | INT | 00β4294967295 | Position in infinite prompt space |
| profileopt | COMBO | camera_angle_default.json | Select vocabulary profile |
| prefixopt | STRING | Text to prepend to generated prompt | |
| suffixopt | STRING | Text to append to generated prompt | |
| angle_typeopt | COMBO | any | Filter by angle type |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | β |