#camera #bevy #smoothing #scene-graph #transform #exponential #component

dev smooth-bevy-cameras

Bevy camera controllers with buttery, exponential smoothing

12 breaking releases

new 0.13.0 Dec 2, 2024
0.12.0 Jul 10, 2024
0.11.0 Feb 19, 2024
0.10.0 Nov 4, 2023
0.2.0 Jan 10, 2022

#109 in Game dev

Download history 276/week @ 2024-08-18 271/week @ 2024-08-25 252/week @ 2024-09-01 165/week @ 2024-09-08 92/week @ 2024-09-15 231/week @ 2024-09-22 154/week @ 2024-09-29 35/week @ 2024-10-06 67/week @ 2024-10-13 88/week @ 2024-10-20 56/week @ 2024-10-27 95/week @ 2024-11-03 49/week @ 2024-11-10 83/week @ 2024-11-17 172/week @ 2024-11-24 280/week @ 2024-12-01

588 downloads per month
Used in 13 crates

MIT license

41KB
779 lines

smooth-bevy-cameras

crates.io docs.rs

A collection of exponentially-smoothed camera controllers for the Bevy Engine.

Look Transform

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); }
}

Look Angles

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.

Built-In Controllers

These plugins depend on the LookTransformPlugin:

  • FpsCameraPlugin + FpsCameraBundle

    • WASD: Translate on the XZ plane
    • Shift/Space: Translate along the Y axis
    • Mouse: Rotate camera
  • OrbitCameraPlugin + OrbitCameraBundle

    • CTRL + mouse drag: Rotate camera
    • Right mouse drag: Pan camera
    • Mouse wheel: Zoom
  • 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.

    • Left mouse drag: Locomotion
    • Right mouse drag: Rotate camera
    • Left and Right or Middle mouse drag: Pan camera
    • While holding any mouse button, use A/D for panning left/right, Q/E for panning up/down
    • While holding any mouse button, use W/S for locomotion forward/backward
    • While holding any mouse button, use scroll wheel to increase/decrease locomotion and panning speeds
    • While holding no mouse button, use scroll wheel for locomotion forward/backward

License: MIT

Dependencies

~21–32MB
~519K SLoC