-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding a bezier curve example (#8194)
# Objective Examples on how to use the freshly merged `Bezier` struct ( #7653 ) are missing. ## Solution - Added a `bezier_curve.rs` example in the `animation/` folder. --------- Co-authored-by: ira <JustTheCoolDude@gmail.com> Co-authored-by: Aevyrie <aevyrie@gmail.com>
- Loading branch information
1 parent
e243175
commit cfa750a
Showing
3 changed files
with
100 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
//! Demonstrates how to work with Cubic curves. | ||
use bevy::{ | ||
math::{cubic_splines::CubicCurve, vec3}, | ||
prelude::*, | ||
}; | ||
|
||
#[derive(Component)] | ||
pub struct Curve(CubicCurve<Vec3>); | ||
|
||
fn main() { | ||
App::new() | ||
.add_plugins(DefaultPlugins) | ||
.add_systems(Startup, setup) | ||
.add_systems(Update, animate_cube) | ||
.run(); | ||
} | ||
|
||
fn setup( | ||
mut commands: Commands, | ||
mut meshes: ResMut<Assets<Mesh>>, | ||
mut materials: ResMut<Assets<StandardMaterial>>, | ||
) { | ||
// Define your control points | ||
// These points will define the curve | ||
// You can learn more about bezier curves here | ||
// https://en.wikipedia.org/wiki/B%C3%A9zier_curve | ||
let points = [[ | ||
vec3(-6., 2., 0.), | ||
vec3(12., 8., 0.), | ||
vec3(-12., 8., 0.), | ||
vec3(6., 2., 0.), | ||
]]; | ||
|
||
// Make a CubicCurve | ||
let bezier = Bezier::new(points).to_curve(); | ||
|
||
// Spawning a cube to experiment on | ||
commands.spawn(( | ||
PbrBundle { | ||
mesh: meshes.add(shape::Cube::default().into()), | ||
material: materials.add(Color::ORANGE.into()), | ||
transform: Transform::from_translation(points[0][0]), | ||
..default() | ||
}, | ||
Curve(bezier), | ||
)); | ||
|
||
// Some light to see something | ||
commands.spawn(PointLightBundle { | ||
point_light: PointLight { | ||
intensity: 9000., | ||
range: 100., | ||
shadows_enabled: true, | ||
..default() | ||
}, | ||
transform: Transform::from_xyz(8., 16., 8.), | ||
..default() | ||
}); | ||
|
||
// ground plane | ||
commands.spawn(PbrBundle { | ||
mesh: meshes.add(shape::Plane::from_size(50.).into()), | ||
material: materials.add(Color::SILVER.into()), | ||
..default() | ||
}); | ||
|
||
// The camera | ||
commands.spawn(Camera3dBundle { | ||
transform: Transform::from_xyz(0., 6., 12.).looking_at(Vec3::new(0., 3., 0.), Vec3::Y), | ||
..default() | ||
}); | ||
} | ||
|
||
pub fn animate_cube( | ||
time: Res<Time>, | ||
mut query: Query<(&mut Transform, &Curve)>, | ||
mut gizmos: Gizmos, | ||
) { | ||
let t = (time.elapsed_seconds().sin() + 1.) / 2.; | ||
|
||
for (mut transform, cubic_curve) in &mut query { | ||
// Draw the curve | ||
gizmos.linestrip(cubic_curve.0.iter_positions(50), Color::WHITE); | ||
// position takes a point from the curve where 0 is the initial point | ||
// and 1 is the last point | ||
transform.translation = cubic_curve.0.position(t); | ||
} | ||
} |