Expand description
§bevy_lagrange
Work in progress. This crate is in active development and not subject to semver stability guarantees. APIs will change without notice between commits. Do not depend on this in production code yet.
A camera controller for Bevy that combines smooth orbit controls with event-driven camera operations — zoom-to-fit, queued animations, and a debug overlay for fit targets.

§Features
- Smooth orbit, pan, and zoom with configurable limits
- Zoom-to-fit, look-at, and queued camera animations with easing
- Event-driven control with full lifecycle events for sequencing
- Orthographic and perspective projection, multi-viewport, render-to-texture
- Touch, trackpad, and
bevy_eguisupport - Debug overlay for fit targets (optional
fit_overlayfeature)
§Quick Start
Add the plugin and spawn a camera:
use bevy::prelude::*;
use bevy_lagrange::LagrangePlugin;
use bevy_lagrange::OrbitCam;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(LagrangePlugin)
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands) {
commands.spawn((
Transform::from_translation(Vec3::new(0.0, 1.5, 5.0)),
OrbitCam::default(),
));
}OrbitCam automatically requires Camera3d. Out of the box you get orbit, pan, and zoom with smoothing.
§Controls
Default mouse controls:
| Input | Action |
|---|---|
| Left Mouse | Orbit |
| Right Mouse | Pan |
| Scroll Wheel | Zoom |
Default touch controls:
| Input | Action |
|---|---|
| One finger | Orbit |
| Two fingers | Pan |
| Pinch | Zoom |
All controls are configurable via OrbitCam fields — buttons, modifiers, sensitivity, smoothness, and limits.
§Event-Driven Camera Control
Enable the fit_overlay feature:
bevy_lagrange = { version = "...", features = ["fit_overlay"] }§Zoom-to-fit
Frame a target entity in the camera view:
commands.trigger(
ZoomToFit::new(camera, target)
.margin(0.15)
.duration(Duration::from_millis(800))
.easing(EaseFunction::CubicOut),
);§Look at
Rotate the camera in place to face a target:
commands.trigger(
LookAt::new(camera, target)
.duration(Duration::from_millis(600)),
);§Animate to a specific orientation
Animate to a chosen yaw/pitch while framing the target:
commands.trigger(
AnimateToFit::new(camera, target)
.yaw(PI / 4.0)
.pitch(PI / 6.0)
.duration(Duration::from_millis(1200)),
);§Queued animations
Chain multiple movements into a sequence:
commands.trigger(PlayAnimation::new(camera, [
CameraMove::ToOrbit {
focus: Vec3::ZERO,
yaw: 0.0,
pitch: 0.5,
radius: 5.0,
duration: Duration::from_millis(800),
easing: EaseFunction::CubicOut,
},
]));All operations support instant (Duration::ZERO) and animated paths with full lifecycle events for sequencing.
§Cargo Features
| Feature | Default | Description |
|---|---|---|
fit_overlay | no | Zoom-to-fit, camera animations, event-driven control, and debug overlay |
bevy_egui | no | Prevents camera movement when interacting with egui windows |
§Version Compatibility
| bevy_lagrange | Bevy |
|---|---|
| 0.0.2 | 0.18 |
§Credits
- Plonq —
bevy_lagrangebuilds on bevy_panorbit_camera, with permission
§License
All code in this repository is dual-licensed under either:
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
at your option.
Structs§
- Active
Camera Data - Tracks which
OrbitCamis active (should handle input events). - Animate
ToFit AnimateToFit— animates the camera to a caller-specified orientation.- Animation
Begin AnimationBegin— emitted when aCameraMoveListbegins processing.- Animation
Cancelled AnimationCancelled— emitted when an animation is cancelled before completion.- Animation
End AnimationEnd— emitted when aCameraMoveListfinishes all its queued moves.- Animation
Rejected AnimationRejected— emitted when an incoming animation request is rejected.- Camera
Move Begin CameraMoveBegin— emitted when an individualCameraMovebegins.- Camera
Move End CameraMoveEnd— emitted when an individualCameraMovecompletes.- Camera
Move List - Component that queues multiple camera movements to execute sequentially.
- Current
FitTarget - Marks the entity that the camera is currently fitted to.
- Input
Control - Interactive input configuration for
OrbitCam. - Lagrange
Plugin - Bevy plugin that contains the systems for controlling
OrbitCamcomponents. - LookAt
LookAt— rotates the camera in place to face a target entity.- Look
AtAnd Zoom ToFit LookAtAndZoomToFit— rotates the camera to face a target entity and frames it.- Orbit
Cam - Tags an entity as capable of panning and orbiting.
- Orbit
CamSystem Set - Base system set to allow ordering of
OrbitCam - Play
Animation PlayAnimation— plays a queued sequence ofCameraMovesteps.- SetFit
Target - Sets the debug overlay target without triggering a zoom.
- Trackpad
Input - Trackpad-specific input configuration for
OrbitCam. - Zoom
Begin ZoomBegin— emitted when aZoomToFitoperation begins.- Zoom
Cancelled ZoomCancelled— emitted when aZoomToFitanimation is cancelled before completion.- Zoom
Context - Context for a zoom-to-fit operation.
- ZoomEnd
ZoomEnd— emitted when aZoomToFitoperation completes (both animated and instant).- Zoom
ToFit ZoomToFit— frames a target entity in the camera view.
Enums§
- Animation
Conflict Policy - Controls what happens when a new animation request conflicts with an active one.
- Animation
Source - Identifies which event triggered an animation lifecycle.
- Button
Zoom Axis - Which axis controls button-based zoom.
- Camera
Input Interrupt Behavior - Controls what happens when user input occurs during an in-flight animation.
- Camera
Move - Individual camera movement with target position and duration.
- Focus
Bounds Shape - The shape to restrict the camera’s focus inside.
- Force
Update - Whether to force a transform update this frame regardless of input.
- Initialization
State - Whether
OrbitCamhas been initialized from the camera’s current transform. - Time
Source - Which time source drives camera smoothing.
- Touch
Input - The control scheme to use for touch input. Given that some touch gestures don’t make sense being changed (e.g. pinch to zoom), there is just a set if different schemes rather than full customization.
- Trackpad
Behavior - Selects how trackpad input is interpreted.
- Upside
Down Policy - Whether the camera is allowed to orbit past the poles into an upside-down orientation.
- Zoom
Direction - Direction of scroll/zoom input.