| Crates.io | smooth-bevy-cameras |
| lib.rs | smooth-bevy-cameras |
| version | 0.14.0 |
| created_at | 2022-01-06 06:56:22.118777+00 |
| updated_at | 2025-05-03 16:06:44.785405+00 |
| description | Bevy camera controllers with buttery, exponential smoothing. |
| homepage | |
| repository | https://github.com/bonsairobo/smooth-bevy-cameras |
| max_upload_size | |
| id | 508809 |
| size | 170,951 |
A collection of exponentially-smoothed camera controllers for the Bevy Engine.
All controllers are based on a [LookTransform] component, which is just an
eye point that looks at a target point. By modifying this component, the
scene graph Transform will automatically be synchronized.
Any entities with all of Transform, LookTransform, and [Smoother]
components will automatically have their Transform smoothed. Smoothing
will have no effect on the LookTransform, only the final Transform in
the scene graph.
use bevy::prelude::*;
use smooth_bevy_cameras::{LookTransform, LookTransformBundle, LookTransformPlugin, Smoother};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
// Enables the system that synchronizes your `Transform`s and `LookTransform`s.
.add_plugins(LookTransformPlugin)
.add_startup_system(setup)
.add_system(move_camera_system);
}
fn setup(mut commands: Commands) {
let eye = Vec3::default();
let target = Vec3::default();
commands
.spawn(LookTransformBundle {
transform: LookTransform::new(eye, target),
smoother: Smoother::new(0.9), // Value between 0.0 and 1.0, higher is smoother.
})
.insert_bundle(Camera3dBundle::default());
}
fn move_camera_system(mut cameras: Query<&mut LookTransform>) {
// Later, another system will update the `Transform` and apply smoothing automatically.
for mut c in cameras.iter_mut() { c.target += Vec3::new(1.0, 1.0, 1.0); }
}
When implementing a camera controller, it's often useful to work directly
with the angles (pitch and yaw) of your look direction. You can do this with
the [LookAngles] type:
use bevy::prelude::*;
use smooth_bevy_cameras::{
LookAngles,
LookTransform
};
fn look_angles(mut transform: LookTransform, delta: Vec2) {
let mut angles = LookAngles::from_vector(transform.look_direction().unwrap());
angles.add_pitch(delta.y);
angles.add_yaw(delta.x);
// Third-person.
transform.eye = transform.target + 1.0 * transform.radius() * angles.unit_vector();
// First-person.
// transform.target = transform.eye + 1.0 * transform.radius() * angles.unit_vector();
}
This is how the built-in controllers implement rotation controls.
These plugins depend on the [LookTransformPlugin]:
FpsCameraPlugin +
FpsCameraBundle
OrbitCameraPlugin +
OrbitCameraBundle
UnrealCameraPlugin +
UnrealCameraBundle
Best use: hold Right mouse button to orbit the view while using WASD to navigate in the scene, using scroll wheel to accelerate/decelerate.
License: MIT