Commit: b5bce54
Parent: 24bcc07

Dog looks at cursor

Mårten Åsberg committed on 2026-04-14 at 09:51
docs/screenshot.png +0 -0
diff --git a/docs/screenshot.png b/docs/screenshot.png
index 10b4eb4..f9ee6e0 100644
Binary files a/docs/screenshot.png and b/docs/screenshot.png differ
src/main.rs +38 -5
diff --git a/src/main.rs b/src/main.rs
index f919b8d..f252166 100644
@@ -1,20 +1,26 @@
use bevy::{
DefaultPlugins,
app::{App, Startup},
app::{App, Startup, Update},
asset::AssetServer,
camera::{Camera3d, OrthographicProjection, Projection, ScalingMode},
ecs::system::{Commands, Res},
camera::{Camera, Camera3d, OrthographicProjection, Projection, ScalingMode},
ecs::{
component::Component,
query::With,
system::{Commands, Res, Single},
},
gltf::GltfAssetLabel,
light::DirectionalLight,
math::Vec3,
math::{Dir3, Vec3, primitives::InfinitePlane3d},
scene::SceneRoot,
transform::components::Transform,
transform::components::{GlobalTransform, Transform},
window::Window,
};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, control_dog)
.run();
}
@@ -33,6 +39,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn((
SceneRoot(asset_server.load(GltfAssetLabel::Scene(0).from_asset("models/animal-dog.glb"))),
Transform::from_xyz(0.0, 0.0, 0.0),
Dog::default(),
));
commands.spawn((
@@ -43,3 +50,29 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
Transform::from_xyz(0.0, 0.0, 0.0).looking_to(Vec3::NEG_Y, Vec3::Z),
));
}
#[derive(Component, Default)]
struct Dog;
fn control_dog(
window: Single<&Window>,
camera: Single<(&Camera, &GlobalTransform)>,
mut dog: Single<&mut Transform, With<Dog>>,
) {
let (camera, camera_transform) = *camera;
let Some(cursor_position) = window
.cursor_position()
.and_then(|cursor| camera.viewport_to_world(camera_transform, cursor).ok())
else {
return;
};
let Some(cursor_position) =
cursor_position.plane_intersection_point(Vec3::ZERO, InfinitePlane3d { normal: Dir3::Y })
else {
return;
};
dog.look_at(-cursor_position, Vec3::Y);
}