Scene settings
Render settings, camera, lights, and physics simulation fields.
Project-wide settings, edited from the Scene Settings panel (shown when nothing is selected) and the Camera inspector.
Render settings
RenderSettings — resolution, format, and quality. The resolution/quality/format presets and their manim CLI mapping are documented in full in Render formats; the fields are summarized here for completeness.
| Field | Values |
|---|---|
resolution | 480p, 720p, 1080p, 1440p, 2160p |
fps | 24, 30, 60 |
aspect | 16:9, 9:16, 1:1, 4:5, 4:3, 21:9 |
backgroundColor | Scene background color |
backgroundImage | Asset stretched to fill the frame behind everything, or null |
backgroundImageOpacity | 0–1 |
backgroundImageExposure | −1 (fully dark) … 0 (as-is) … +1 (blown out) |
quality | preview or final |
outputFormat | mp4, gif, webm_alpha |
Camera
CameraState — the 2D camera, always present:
| Field | Meaning |
|---|---|
position | 2D frame center |
z | 3D scenes only: height of the frame center above the ground plane |
zoom | Frame scale multiplier, 1 = default frame |
rotation | Frame roll, degrees |
followObjectId | 2D scenes only: when set (Camera panel → Follow), the camera frame stays centered on this object every frame instead of only moving via keyframes — compiles to self.camera.frame.add_updater(lambda m: m.move_to(target.get_center())). Zoom/rotation keyframes still apply on top; a position keyframe active at the same time will fight the follow updater, so use one or the other. Not available in 3D scenes — ThreeDScene's self.move_camera has no persistent frame object an updater could attach to |
Camera3DState — the initial 3D camera, used whenever the scene contains a 3D object:
| Field | Meaning |
|---|---|
phi | Polar angle from the z axis, degrees (0 = top-down, like 2D) |
theta | Azimuth about the z axis, degrees |
ambientRotation | Degrees per second of automatic orbit; 0 = off |
Optional "cinematic" extras — editor-preview conveniences, some of which map to real Manim camera settings:
| Field | Meaning |
|---|---|
fov | Perspective field-of-view, degrees; unset = orthographic (Manim's default) |
focalDistance | Depth-of-field focus distance, scene units (Manim focal_distance) |
aperture | Depth-of-field strength, 0 = off, larger = more blur (editor preview only) |
nearClip, farClip | Near/far clip planes, scene units (editor preview only) |
safeArea | Show title-safe + rule-of-thirds guides on the camera frame |
Camera moves are keyframed like any other event — see the camera animation kind in Animations.
Lights
SceneLight — lights shape the editor's shaded 3D preview only. Manim's Cairo renderer has no light objects, so lights are not compiled to Python; a rendered video ignores them entirely.
| Field | Meaning |
|---|---|
kind | point, sun, spot, or area |
position | World position, scene units |
target | Aim point for sun/spot (direction = target − position) |
color | Light color |
intensity | Brightness multiplier |
range | Point/spot falloff distance; 0 = infinite |
angle | Spot cone half-angle, degrees |
penumbra | Spot edge softness, 0–1 |
width, height | Area light size, scene units |
radius | Soft-shadow source radius |
castShadow | Whether the light casts shadows in the preview |
Environment/HDRI (project.environment) is likewise editor-preview only — an image-based lighting preset name, never compiled.
3D environment
The ground you stand a solid on while building it, set in Scene ▸ 3D Environment. Judging a shape floating in an empty void is genuinely hard — a floor gives you depth cues, and the reference lines tell you which way is up. Different work wants different scaffolding, which is why this is a set of presets rather than one fixed grid.
Floor styles:
| Style | Looks like |
|---|---|
| Grid | The classic square lattice — a good default under most solids |
| Dots | A mark at each intersection — quieter under detailed geometry |
| Polar | Rings and spokes — the right frame for anything rotational |
| Isometric | A triangular lattice, for isometric and crystal figures |
| Plane | A filled ground with no ruling, for when only the horizon matters |
| None | Empty space — nothing but your objects |
Alongside the style:
| Setting | Meaning |
|---|---|
| Extent | How far the floor reaches out from the origin, in scene units |
| Spacing | Distance between grid lines, in scene units |
| Axes | Draw the colored X/Y/Z reference lines through the origin |
| Drop lines | A faint vertical line from each solid straight down to the floor — the quickest way to see where something actually sits, rather than where it appears to sit |
| Horizon fade | Fades the floor toward its outer edges so distance reads instead of ending at a hard rim |
Simulation / physics
SimulationSettings — one physics world per project:
| Field | Meaning |
|---|---|
gravity | Vec3, scene units/s² (default: {x:0, y:0, z:-9.8} — the app is z-up, so gravity points down the −Z axis) |
ground | Adds an infinite static floor at groundZ that bodies rest/bounce on |
groundZ | Floor height |
duration | Simulated seconds; null = the whole project duration |
substeps | Solver substeps per rendered frame — higher is more stable but slower |
PhysicsBody — per-object, on 3D solids only:
| Field | Meaning |
|---|---|
enabled | Participates in the simulation |
bodyType | dynamic (moved by the solver) or static (immovable collider — floors, ramps, walls) |
mass | Kilograms; ignored for static bodies |
restitution | Bounciness, 0 (dead) … 1 (perfectly elastic) |
friction | Surface friction, 0 (ice) … ~1 (grippy) |
velocity | Initial linear velocity, scene units/s |
angularVelocity | Initial angular velocity, radians/s |
collider | auto (derived from the object's geometry), box, or sphere |
Running "Bake simulation" steps a Rapier physics world across the timeline and writes the result onto each dynamic object as bakedMotion — a dense per-frame track of positions and orientation quaternions, sampled at the project's fps. Once an object has baked motion, both the preview and the compiler drive it from that track instead of its keyframes; re-baking overwrites it, and clearing it restores keyframe control. See Use physics for the end-to-end workflow.
Timeline markers
TimelineMarker — named points on the timeline ruler, used as chapter/section breaks:
| Field | Meaning |
|---|---|
id | Identifier |
time | Scene-time seconds |
label | Displayed name |
color | Marker color on the ruler |
By default, each marker compiles to a self.next_section(label) call at that point in the generated scene, splitting the render into named sections within ONE continuous class (useful with manim's -s/--save_sections flag for scrubbing to a chapter in the output).
Multi-scene export: the "View generated Python" modal (Scene panel → Export) shows a Split into chapters checkbox whenever the project has markers. Turning it on compiles one independent Scene subclass per chapter instead of a single continuous class — each chapter is separately manim render -s <ChapterName>-able, and the class name comes from the marker's own label (de-duplicated automatically if two markers share a label). A marker that isn't already sitting at a rest point (no animation in flight at that instant) is silently snapped to the nearest one, with a warning shown in the modal — Manim can't reconstruct a scene's state mid-animation for a fresh class to pick up from, so an arbitrary cut point isn't safe to split on. See Render formats for how this fits into the rest of the export flow.