Open-source project
ShuaixinHuang/image-multiple-angles-3d-camera avatar
ShuaixinHuang/image-multiple-angles-3d-camera

Image Multiple Angles 3D Camera is a widget that writes a viewpoint into an edit prompt

🎬 Generate images from any camera viewpoint via 3D interactive control. Drag the camera in 3D space or use sliders to set azimuth/elevation/distance, then generate. Built with Three.js + Gradio, bilingual ZH/EN UI.

1,020 stars21 forksPythonLicense varies

At a glance

What is it?
This is a Gradio and Three.js application that turns three camera numbers, azimuth, elevation and distance, into an image edit request, with Qwen-Image-Edit-Plus on Alibaba's DashScope as the default backend. The widget, the bilingual shell and the batch loop are small and readable; the accuracy of the result is a property of that one default model, and the project says so.
Who is it for?
Use this app if you want to see how a viewpoint prompt behaves before you build anything around it, and if you are willing to pay per call through DashScope or to download about 56 GB of weights onto a 16 GB card. Do not expect the pluggable-backend story to be symmetric: swapping in another image editor means reimplementing the angle fidelity yourself, which the project flags as a Qwen-Image-Edit-Plus capability.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 45 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The origin is a paywalled product rebuilt on a free quota

The stated motivation is competitive rather than scientific. Camera viewpoint conversion products already exist, the page names Alibaba's MultipleAngles as one, and the observation is that they sit behind a paywall. The project's answer is to reproduce the same 3D camera control and multi-angle generation on the official free API quota, with code you can read and deploy yourself.

That framing explains the shape of the repository. It is small: an entry point per language, one shared core, a requirements file, two Windows launcher scripts and three demo images. There is no packaging, no CLI beyond the Python entry points, no test suite, and no GitHub releases. The last push is dated 2026-08-28 and the repository is not archived.

The licensing picture is the loose end. The header carries a license badge linking to a LICENSE file, and the repository root has no such file; the project metadata records no license either. So the page points at terms that are not in the repository. Read that as unresolved rather than permissive, especially before you fork it.

One function is the backend seam, and the accuracy claim is not portable

Pluggability is presented as a single edit. Replace `infer_camera_edit` in `core.py` and any image editing model can sit behind the same interface, which is what makes the app a harness rather than a fixed pipeline.

The warning attached to that seam matters more than the promise. Precise angle control driven by a viewpoint prompt is described as a characteristic capability of Qwen-Image-Edit-Plus, and the page says other models may fail to reproduce the specified viewpoint. So the seam is real for wiring but not for results: with a different model behind it, the same azimuth and elevation sliders stop guaranteeing the same framing.

The default path is therefore the interesting path. API mode talks to DashScope, the Alibaba Cloud model service, through the `dashscope` package, and the recommended way to supply credentials is the `DASHSCOPE_API_KEY` environment variable, with `API_KEY` in `core.py` as the alternative. The app is billed per call, and the documented prerequisite is an Alibaba Cloud account.

Local deployment is a different project with a 56 GB download

The second mode trades the network for hardware. It asks for an NVIDIA GPU with 16 GB or more of memory, suggests an RTX 3090 or better, and about 60 GB of free disk for roughly 56 GB of downloads. Running offline also means installing a second, much larger dependency set and writing the inference yourself.

The snippet the page gives for doing that is a `QwenImageEditPlusPipeline` built in bfloat16, moved to CUDA when available, loading the `Qwen/Qwen-Image-Edit-2511` checkpoint and then attaching two LoRA adapters: a four-step Lightning adapter from lightx2v and a Multiple-Angles adapter from fal. Two adapters, not one, and the second is the one whose name matches the feature. The snippet ends at that second adapter's `weight_name` line, with the call left open.

So the honest comparison is: API mode is three packages and a per-call bill, while local mode is a GPU, a 56 GB download, a base checkpoint and two adapters.

The two dependency lists do not name the same packages

`requirements.txt` carries three active lines for the API mode: gradio at 4.0 or newer, dashscope at 1.20 or newer, and pillow at 9.0 or newer. Everything else in the file is commented out, with a note that these are only needed if you follow the local deployment path in the readme. The commented block is: diffusers from git, transformers, accelerate, safetensors, sentencepiece, peft, torchvision, `torchao==0.11.0`, and kernels.

The readme's own install line for the same step names a different set:

bash
pip install -r requirements.txt
pip install gradio diffusers transformers accelerate peft safetensors sentencepiece torchvision

`torchao` and `kernels` are absent from that command, and diffusers comes from PyPI there rather than from git. Since the local path is the one that needs the heavier stack, and its two lists disagree on which packages it is, treat the readme line as a convenience and the commented block in `requirements.txt` as the closer reading of what the code touches.

Azimuth has eight stops and elevation has four, and neither reaches straight down

The camera is not a free orbit. Azimuth offers eight discrete values, 0, 45, 90, 135, 180, 225, 270 and 315 degrees. Elevation offers four: -30, 0, 30 and 60 degrees, and the table states plainly that straight up and straight down are not supported. Distance is the only continuous axis, running from 0.6 to 1.8 in steps of 0.05.

That gives 32 fixed azimuth and elevation combinations, which is why the feature is described as an 8 by 4 view grid covering common shooting angles. On top of the grid sit six one-click presets: front, right, back, left, aerial and close-up. Close-up is the preset that matters for the distance axis, since it is where the 0.6 end of the slider does its work.

Multiple viewpoints can be selected and generated in one batch, with the results gathered together for review, which is the practical reason to have a discrete grid at all: you can queue an orbit around a subject and get the set back at once.

The 3D widget covers two axes and hands distance to a slider

The Three.js control is a camera model with two draggable handles, colour-coded by axis: a green handle for azimuth, dragged along a horizontal ring, and a pink handle for elevation, dragged along an arc. As you drag, the camera flies along its orbit in real time.

Distance used to be a third handle and is not any more. A note states that distance is controlled through the slider below the view, continuous with a step of 0.05, and is no longer handled in 3D. That is a deliberate simplification of the widget, and it is the kind of detail that only shows up when you try to drag for it.

The preview is live rather than a placeholder: once an image is uploaded it is textured onto the 3D plane, so what the widget shows is the shot you are about to ask for rather than an empty stage. That preview is a 2D image on a 3D quad, so it shows framing and not parallax; the view from the new angle only exists after the edit comes back.

Three entry points exist so the bilingual shell is not duplicated

The layout keeps one core and several thin front doors. `core.py` holds the shared parts: the 3D control, the API call, helpers, CSS and JavaScript. `app_zh.py` and `app_en.py` start the two interfaces, and `app.py` is a unified entry that defaults to Chinese and switches to English with a parameter, so `python app.py` and `python app.py en` reach the same two places. Windows users can double-click `run_zh.bat` or `run_en.bat` instead of typing a command.

Both interfaces serve on `http://127.0.0.1:7860`, bound to the loopback address rather than to the network. Adding a third language means translating one dictionary, since the strings live in a dict and the core does not branch on language.

Around the widget sit the two features that make a session usable rather than a demo. A history gallery tab holds large thumbnails of everything generated in the session, with download and clear. A seed and a negative prompt are adjustable, so a result can be reproduced instead of merely admired, and batch generation sends several selected viewpoints in one go.

Editorial conclusion

Use this app if you want to see how a viewpoint prompt behaves before you build anything around it, and if you are willing to pay per call through DashScope or to download about 56 GB of weights onto a 16 GB card. Do not expect the pluggable-backend story to be symmetric: swapping in another image editor means reimplementing the angle fidelity yourself, which the project flags as a Qwen-Image-Edit-Plus capability. Before you redistribute anything, settle the licensing question, since the page links a license badge while the repository root carries no license file and the metadata records none. And read the two dependency lists side by side before choosing the local path, because they do not name the same set of packages.

Frequently asked questions

What is image-multiple-angles-3d-camera?

It is a Gradio and Three.js web application that generates an image from a chosen camera viewpoint by setting azimuth, elevation and distance, then editing the uploaded photo to match. The interface switches between Chinese and English, and the default backend is Qwen-Image-Edit-Plus through Alibaba's DashScope.

Do I need a GPU to run image-multiple-angles-3d-camera?

Not for the API mode, which needs only gradio, dashscope and pillow and bills per call through an Alibaba Cloud account. Local deployment asks for an NVIDIA GPU with 16 GB or more of memory, an RTX 3090 or better is suggested, and roughly 56 GB of downloads with 60 GB or more of free disk.

Can image-multiple-angles-3d-camera use another image editing model?

Replace the `infer_camera_edit` function in core.py and any model can sit behind the same interface. The page warns that precise angle control from a viewpoint prompt is a Qwen-Image-Edit-Plus capability, so other models may not reproduce the specified viewpoint.

Which camera angles can image-multiple-angles-3d-camera set?

Azimuth has eight discrete values from 0 to 315 degrees in 45 degree steps, elevation has four values of -30, 0, 30 and 60 degrees with straight up and down unsupported, and distance runs continuously from 0.6 to 1.8 in steps of 0.05. Six one-click presets and batch generation over selected viewpoints sit on top.

How do I start image-multiple-angles-3d-camera?

Install `requirements.txt`, then run `python app.py` for the Chinese interface or `python app.py en` for English, with `app_zh.py` and `app_en.py` as the direct entry points. Supply the key as DASHSCOPE_API_KEY or in the API_KEY constant in core.py, then open http://127.0.0.1:7860.

What license does image-multiple-angles-3d-camera use?

The page links a license badge, but the repository root contains no LICENSE file and the project metadata records no license either. The terms are therefore not stated anywhere in the repository, so check before forking or redistributing.

Official sources

  1. Issues
  2. README
  3. ShuaixinHuang/image-multiple-angles-3d-camera on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/shuaixinhuang-image-multiple-angles-3d-camera.svg)](https://hysenlabs.com/projects/shuaixinhuang-image-multiple-angles-3d-camera)