• Stars
    star
    373
  • Rank 110,968 (Top 3 %)
  • Language
    Rust
  • License
    Apache License 2.0
  • Created almost 3 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Composable camera rigs

πŸŽ₯ dolly

Crates.io Docs Rust 1.60

Combine simple building blocks to create smooth cameras: first-person, chase, orbit, look-at, you name it!

Camera rigs made with dolly are engine-agnostic, and only provide camera positioning. Optical and rendering parameters such as field of view and clipping planes can be built on top, and are not within the scope of this crate.

While cameras are a complex topic in gamedev, this crate only provides the basics, aiming at small games and tools.

Examples

orbit.mp4
let mut camera = CameraRig::builder()
    .with(YawPitch::new().yaw_degrees(45.0).pitch_degrees(-30.0))
    .with(Smooth::new_rotation(1.5))
    .with(Arm::new(Vec3::Z * 4.0))
    .build();

// ...

let camera_driver = camera.driver_mut::<YawPitch>();
if keyboard.was_just_pressed(VirtualKeyCode::Z) {
    camera_driver.rotate_yaw_pitch(-90.0, 0.0);
}
if keyboard.was_just_pressed(VirtualKeyCode::X) {
    camera_driver.rotate_yaw_pitch(90.0, 0.0);
}

camera.update(time_delta_seconds);

follow.mp4
let mut camera = CameraRig::builder()
    .with(Position::new(car.position))
    .with(Rotation::new(car.rotation))
    .with(Smooth::new_position(1.25).predictive(true))
    .with(Arm::new(Vec3::new(0.0, 1.5, -3.5)))
    .with(Smooth::new_position(2.5))
    .with(
        LookAt::new(car.position + Vec3::Y)
            .tracking_smoothness(1.25)
            .tracking_predictive(true),
    )
    .build();

// ...

camera.driver_mut::<Position>().position = car.position;
camera.driver_mut::<Rotation>().rotation = car.rotation;
camera.driver_mut::<LookAt>().target = car.position + Vec3::Y;

look-at.mp4
let mut camera = CameraRig::builder()
    .with(Position::new(Vec3::Y * 3.0))
    .with(LookAt::new(car.position))
    .build();

// ...

camera.driver_mut::<LookAt>().target = car.position;
camera.update(time_delta_seconds);

free.mp4
let mut camera = CameraRig::builder()
    .with(Position::new(Vec3::Y))
    .with(YawPitch::new())
    .with(Smooth::new_position_rotation(1.0, 1.0))
    .build();

// ...

let move_vec = camera.transform.rotation
    * Vec3::new(input["move_right"], input["move_up"], -input["move_fwd"])
        .clamp_length_max(1.0)
    * 10.0f32.powf(input["boost"]);

camera
    .driver_mut::<YawPitch>()
    .rotate_yaw_pitch(-0.3 * mouse.delta.x, -0.3 * mouse.delta.y);
camera
    .driver_mut::<Position>()
    .translate(move_vec * time_delta_seconds * 10.0);
camera.update(time_delta_seconds);