A DSLR-style exposure dial for the 3ds Max Physical Camera. Av / Tv / M priority modes with a locked exposure value — turn the aperture dial and the shutter solves itself, exactly like a real camera.
The Physical Camera in 3ds Max has real aperture, shutter, and ISO — but as three disconnected spinners. Open up from f/8 to f/2.8 for softer depth of field and your render blows out by three stops, and you get to do the reciprocal math yourself. Real cameras solved this decades ago with the mode dial. This plugin brings that dial to Max.
Read the full story: The Exposure Triangle — and Why Your 3D Camera Should Behave Like a Real One
- Av / Tv / M priority modes — set the parameter you care about; the dependent one is solved live to hold the locked EV
- Camera-style UI (PySide6): knurled rotary dials for mode + aperture, stop-sliders for shutter + ISO, live EV readout — readouts always match the Modify panel digit-for-digit
- Photographic stop snapping — full / half / third stops, like the click-stops on a lens (optional)
- Auto ISO — in Manual mode, sensitivity absorbs the exposure difference
- Depth of field — one toggle for the camera's DoF, plus ⌖ Pick Focus: click any object in the viewport and the camera focuses on it. Pick Focus is always available — it switches Depth of Field on for you, and it never re-aims the camera (focus distance changes, composition doesn't)
- Multi-camera — header dropdown lists every Physical Camera; follows viewport selection; each camera remembers its own mode and settings
- Well-behaved — one undo step per change, never creates keyframes behind your back (Auto Key safe), reacts live to Track View / animation / scripted changes
- Classic rollout included — a plain spinner dialog ships alongside the dial UI as a fallback
- Download
dist/ExposurePriority_v1.1.mzp(or grab it from Releases) - Drag it into any 3ds Max 2026 / 2027 viewport — that's the whole install
- Add the button: Customize → Customize User Interface → Toolbars → category Exposure Tools → drag Exposure Dial onto a toolbar
No dependencies. Python and PySide6 ship inside 3ds Max — nothing else to download, no admin rights needed. Installs per-user, per-Max-version; re-run the .mzp to upgrade.
- Select a Physical Camera and press Exposure Dial
- Mode dial to Av, drag the aperture to f/2.8 — watch the shutter slider follow on its own, exposure unchanged
- Hit ⌖ PICK FOCUS and click your hero object — Depth of Field switches on by itself and the prompt bar confirms the new focus distance
- Gear menu: EV lock, Auto ISO, snap, stop increments, follow-selection, sync
Note: aperture/shutter/ISO affect rendered brightness when the Physical Camera Exposure Control is active (Rendering → Environment). Max normally sets this up when you create a Physical Camera.
| Layer | File | Role |
|---|---|---|
| Math | ExposureMath.ms |
Pure exposure arithmetic (EV, solves, stop snapping) — no Max dependency |
| Camera I/O | CameraController.ms |
The only layer that touches the camera node (probe-verified property mapping) |
| Brain | ExposureModeController.ms |
Av/Tv/M logic, EV lock, Auto ISO, undo transactions, recursion guard |
| Classic UI | ExposurePriorityUI.ms |
Rollout dialog + external-change binding (one code path for every change source) |
| Dial UI | ExposureDialUI.py |
PySide6 window with custom-painted dials, driving the same MaxScript controllers via pymxs |
| Installer | dist_src/ + build_mzp.ps1 |
Drag-and-drop .mzp package |
The Python UI re-implements nothing — it calls the same controller methods the rollout uses, so both UIs share one logic path. Deep technical notes (parameter-mapping gotchas, shutter-unit storage quirks, undo/Auto Key design): docs/TECHNICAL.md.
58/58 headless assertions pass on 3ds Max 2026.3 and 2027 via 3dsmaxbatch.exe RunTests.ms — math library, property mapping against a real Physical Camera node, EV preservation in all modes, single-transaction undo, Auto Key safety, external change binding, DoF accessors, and focus picking (including the v1.1 aim-preservation contract). The pymxs bridge has its own headless integration suite.
- 3ds Max 2026 or 2027 (both verified; other versions: check the parameter mapping in
CameraController.mswithshowProperties) - Stock Physical Camera
powershell -ExecutionPolicy Bypass -File build_mzp.ps1
# -> dist/ExposurePriority_v1.1.mzpv1.1 — Pick Focus fixes (thanks Jonas for the report!)
- ⌖ PICK FOCUS is always clickable. It used to sit disabled until DEPTH OF FIELD was switched on — with DoF off, clicking in the viewport did nothing and focus appeared "locked". Picking now enables DoF automatically.
- Focus never re-aims the camera. Targeted cameras previously had their target
moved to the picked object, changing the composition. Focus now always goes through
specify_focus+focus_distance; aim is untouched — like focusing a real camera. - Feedback. The Max prompt bar now confirms every pick ("Focus: @ "),
cancellation, and any failed write (which previously failed silently).
v1.0 — initial release.
