Language / 语言 / 言語 / 언어: English | 中文 | 日本語 | 한국어
A ComfyUI custom node for 3D camera angle control. Provides an interactive Three.js viewport to adjust camera angles and outputs formatted prompt strings for multi-angle image generation.

- Interactive 3D Camera Control - Drag handles in the Three.js viewport to adjust:
- Horizontal angle (azimuth): 0° - 360°
- Vertical angle (elevation): -30° to 60°
- Zoom level: 0 - 10
- Quick Select Dropdowns - Three dropdown menus for quickly selecting preset camera angles:
- Azimuth: front view, quarter views, side views, back view
- Elevation: low-angle, eye-level, elevated, high-angle shots
- Distance: wide shot, medium shot, close-up
- Real-time Preview - Connect an image input to see it displayed in the 3D scene as a card with proper color rendering
- Camera View Mode - Toggle
camera_viewto preview the scene from the camera indicator's perspective, with interactive orbit controls (drag to rotate, scroll to zoom) - Prompt Output - Outputs formatted prompts compatible with Qwen-Image-Edit-2511-Multiple-Angles-LoRA
- Bidirectional Sync - Slider widgets, 3D handles, and dropdowns stay synchronized
- Multi-language Support - UI labels available in English, Chinese, Japanese, and Korean (auto-detected from ComfyUI settings)
-
Navigate to your ComfyUI custom nodes folder:
cd ComfyUI/custom_nodes -
Clone this repository:
git clone https://github.com/jtydhr88/ComfyUI-qwenmultiangle.git
-
Restart ComfyUI
-
Download LoRA from https://huggingface.co/fal/Qwen-Image-Edit-2511-Multiple-Angles-LoRA/tree/main into your lora folder
This project uses Vue 3, TypeScript, and Vite for building the frontend. The 3D viewport is built with Three.js. The backend uses ComfyUI's V3 node API.
- Node.js 18+
- npm
# Install dependencies
npm install
# Build for production
npm run build
# Build with watch mode (for development)
npm run dev
# Type check
npm run typecheckComfyUI-qwenmultiangle/
├── src/
│ ├── main.ts # Extension entry point (Vue app mounting)
│ ├── App.vue # Root Vue component
│ ├── CameraWidget.ts # Headless Three.js camera control engine
│ ├── i18n.ts # Internationalization (en/zh/ja/ko)
│ ├── types.ts # TypeScript type definitions
│ ├── components/
│ │ ├── SceneCanvas.vue # Three.js canvas container
│ │ └── ControlPanel.vue # Dropdown controls & value display
│ └── composables/
│ └── useCameraWidget.ts # Reactive state bridge (Vue ↔ Three.js)
├── js/ # Build output (committed for distribution)
│ ├── main.js
│ └── assets/
│ └── main.css
├── nodes.py # ComfyUI V3 node definition
├── __init__.py # Python module init
├── package.json
├── tsconfig.json
└── vite.config.mts
- Add the Qwen Multiangle Camera node from the
image/multianglecategory - Optionally connect an IMAGE input to preview in the 3D scene
- Adjust camera angles by:
- Dragging the colored handles in the 3D viewport
- Using the slider widgets
- Selecting preset values from the dropdown menus
- Toggle
camera_viewto see the preview from the camera's perspective - The node outputs a prompt string describing the camera angle
| Widget | Type | Description |
|---|---|---|
| horizontal_angle | Slider | Camera azimuth angle (0° - 360°) |
| vertical_angle | Slider | Camera elevation angle (-30° to 60°) |
| zoom | Slider | Camera distance/zoom level (0 - 10) |
| default_prompts | Checkbox | Deprecated - Kept for backward compatibility only, has no effect |
| camera_view | Checkbox | Preview scene from camera's perspective |
| Handle | Color | Control |
|---|---|---|
| Ring handle | Pink | Horizontal angle (azimuth) |
| Arc handle | Cyan | Vertical angle (elevation) |
| Line handle | Gold | Zoom/distance |
The image preview displays as a card - front shows the image, back shows a grid pattern when viewed from behind.
When camera_view is enabled, you can interactively control the camera using mouse:
| Action | Control |
|---|---|
| Drag left/right | Rotate horizontally (azimuth) |
| Drag up/down | Rotate vertically (elevation) |
| Scroll up | Zoom in (increase distance) |
| Scroll down | Zoom out (decrease distance) |
All interactions respect the same limits as the sliders:
- Azimuth: 0° - 360° (wraps around)
- Elevation: -30° to 60°
- Distance: 0 - 10
Changes made via orbit controls automatically sync with the slider widgets.
Three dropdown menus are available in the 3D viewport for quickly selecting preset camera angles:
| Dropdown | Options |
|---|---|
| Horizontal (H) | front view, front-right quarter view, right side view, back-right quarter view, back view, back-left quarter view, left side view, front-left quarter view |
| Vertical (V) | low-angle shot, eye-level shot, elevated shot, high-angle shot |
| Distance (Z) | wide shot, medium shot, close-up |
Selecting a preset will automatically update the 3D handles and slider widgets.
The UI labels are automatically translated based on your ComfyUI language setting:
| Language | Code |
|---|---|
| English | en |
| Chinese (Simplified) | zh |
| Japanese | ja |
| Korean | ko |
The output prompt is always in English regardless of the UI language.
The node outputs prompts in the format required by Qwen-Image-Edit-2511-Multiple-Angles-LoRA:
<sks> {azimuth} {elevation} {distance}
Examples:
<sks> front view eye-level shot medium shot<sks> right side view high-angle shot close-up<sks> back-left quarter view low-angle shot wide shot
| Parameter | Values |
|---|---|
| Azimuth | front view, front-right quarter view, right side view, back-right quarter view, back view, back-left quarter view, left side view, front-left quarter view |
| Elevation | low-angle shot (-30°), eye-level shot (0°), elevated shot (30°), high-angle shot (60°) |
| Distance | close-up, medium shot, wide shot |
This ComfyUI node is based on qwenmultiangle, a standalone web application for camera angle control.
The original project was inspired by:
- multimodalart/qwen-image-multiple-angles-3d-camera on Hugging Face Spaces
- fal.ai - Qwen Image Edit 2511 Multiple Angles
- ComfyUI-qwenmultiangle-plus - Another modified version based on this project
MIT