From 993ac28de56be387f3b2a6dd8b19a06868d0f881 Mon Sep 17 00:00:00 2001 From: devil-ira Date: Sat, 25 Mar 2023 14:55:37 +0100 Subject: [PATCH] Rework the example slightly Co-authored-by: Rob Parrett --- examples/3d/3d_viewport_to_world.rs | 69 +++++++++-------------------- 1 file changed, 20 insertions(+), 49 deletions(-) diff --git a/examples/3d/3d_viewport_to_world.rs b/examples/3d/3d_viewport_to_world.rs index ffa29977e4aa6..e22a62f7cd1ec 100644 --- a/examples/3d/3d_viewport_to_world.rs +++ b/examples/3d/3d_viewport_to_world.rs @@ -1,96 +1,67 @@ //! This example demonstrates how to use the `Camera::viewport_to_world` method. -use bevy::{pbr::CascadeShadowConfigBuilder, prelude::*}; +use bevy::prelude::*; fn main() { App::new() .add_plugins(DefaultPlugins) - .add_startup_system(setup) - .add_system(move_cube) + .add_systems(Startup, setup) + .add_systems(Update, move_cube) .run(); } fn move_cube( camera_query: Query<(&Camera, &GlobalTransform)>, - mut cube_query: Query<&mut Transform, With>, + ground_query: Query<&Transform, With>, windows: Query<&Window>, - input: Res>, + mut gizmos: Gizmos, ) { let (camera, camera_transform) = camera_query.single(); - let mut transform = cube_query.single_mut(); - - if !input.pressed(MouseButton::Left) { - return; - } + let ground = ground_query.single(); let Some(cursor_position) = windows.single().cursor_position() else { return; }; + // Calculate a ray pointing from the camera into the world based on the cursor's position. let Some(ray) = camera.viewport_to_world(camera_transform, cursor_position) else { return; }; - let Some(distance) = ray.intersect_plane(Vec3::ZERO, Vec3::Y) else { return; }; - + // Calculate if and where the ray is hitting the ground plane. + let Some(distance) = ray.intersect_plane(ground.translation, ground.up()) else { return; }; let point = ray.get_point(distance); - transform.translation = point + Vec3::Y * 0.5; + + // Draw a line poking out of the ground plane at that position. + gizmos.ray(point, ground.up(), Color::BLACK); } #[derive(Component)] -struct Cube; +struct Ground; fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, - asset_server: Res, ) { // plane - commands.spawn(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Plane { - size: 50.0, - subdivisions: 0, - })), - material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()), - ..default() - }); - - // cube commands.spawn(( PbrBundle { - mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), - material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), - transform: Transform::from_xyz(0.0, 0.5, 0.0), + mesh: meshes.add(Mesh::from(shape::Plane { + size: 20.0, + subdivisions: 0, + })), + material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()), ..default() }, - Cube, + Ground, )); // light commands.spawn(DirectionalLightBundle { transform: Transform::from_translation(Vec3::ONE).looking_at(Vec3::ZERO, Vec3::Y), - directional_light: DirectionalLight { - shadows_enabled: true, - ..default() - }, - cascade_shadow_config: CascadeShadowConfigBuilder { - maximum_distance: 15., - ..default() - } - .into(), ..default() }); // camera commands.spawn(Camera3dBundle { - transform: Transform::from_xyz(0.0, 6.0, 6.0).looking_at(Vec3::ZERO, Vec3::Y), + transform: Transform::from_xyz(15.0, 5.0, 15.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); - - // UI - commands.spawn(TextBundle::from_section( - "Press the left mouse button to reposition the box.", - TextStyle { - font: asset_server.load("fonts/FiraMono-Medium.ttf"), - font_size: 32., - ..default() - }, - )); }