3D Camera Prompt
A 3D camera widget that writes the shot for you — no API key, no Gemini call
- image
- prompt
3D Camera Prompt is the odd one out in the gemini-3-simply-comfyui pack: it never calls the Gemini API, needs no API key, and costs you nothing per run. It's a little three.js scene on your node, you drag a virtual camera around, and it hands you a plain-English description of the shot - something like "front-right quarter view eye-level shot medium shot". You feed that string into the prompt input of the pack's Gemini Text or Gemini 3 Pro Image node, and suddenly telling the model where the camera is stops being a guessing game.
This is the node I'd actually reach for first in this pack, precisely because it's free and local. Camera control is one of the weakest parts of prompt-only generation - everyone has burned a dozen credits going back and forth between "low angle" and "high angle" and getting the same head-on image. Dragging handles in a 3D scene beats that. It's a port of the qwen-image-multiple-angles-3d-camera Hugging Face space's idea, but wired straight into your graph instead of a browser demo.
How it works
The node hides its three float inputs behind a DOM widget. Inside you get a subject placeholder (or your own image) on a grid, plus three colored handles you grab and drag:
- the green ring controls azimuth - rotation around the subject,
- the pink arc controls elevation - how high or low the camera sits,
- the orange handle controls distance - how close or wide the shot is.
The clever bit is the snapping. Values don't stay arbitrary; they snap to a fixed set - 8 azimuths (front, front-right quarter, right, back-right quarter, back, back-left quarter, left, front-left quarter), 4 elevations (low-angle, eye-level, elevated, high-angle), and 3 distances (close-up, medium, wide). Let go of a handle and it animates to the nearest snap point over ~200ms, then writes the snapped value back into the hidden float widgets. So what gets serialized into your workflow file always matches what you saw, and the prompt preview in the corner updates live as you drag.
Inputs and output
The only inputs that matter are the three camera values:
- azimuth - 0–360°, where 0 is front, 90 right, 180 back, 270 left
- elevation - −30 (low) to 60 (high)
- distance - 0.6 (close-up) to 1.8 (wide)
There's also an optional image input, but don't expect it to change the prompt: it just becomes the plane in the 3D scene so you can frame a shot around an actual render instead of a gray mannequin. It's a preview, not an input to the text. The output is a single prompt STRING, and it wires into the prompt slot of either Gemini node in this pack - or into any local checkpoint's text encoder if you just want the framing language.
Install and gotchas
Install is the same as the rest of the pack - ComfyUI Manager (search "gemini-3-simply-comfyui") or:
cd ComfyUI/custom_nodes
git clone https://github.com/lazyq666/gemini-3-simply-comfyui
The pack's requirements.txt installs google-genai, which this node never actually calls - but install it anyway so the pack loads. The one real gotcha: the 3D view loads three.js from unpkg at runtime, so ComfyUI needs internet when the page loads. If a CDN is blocked you'll silently get plain azimuth/elevation/distance sliders instead of the scene - the node still works fine that way, check the browser console for a THREE load error if the scene never appears. For a visual camera tool, that's about the only failure mode worth knowing.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| azimuth | FLOAT | 00–360 | — |
| elevation | FLOAT | 0-30–60 | — |
| distance | FLOAT | 1.000.6–1.8 | — |
| imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |