/
neck_trainer.rs
88 lines (80 loc) · 2.42 KB
/
neck_trainer.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use bevy::prelude::*;
use bevy_scene_hook::{HookPlugin, HookedSceneBundle, SceneHook};
use bevy_webcam_facial::*;
fn main() {
App::new()
.insert_resource(Average::default())
.insert_resource(ClearColor(Color::WHITE))
.insert_resource(AmbientLight {
color: Color::WHITE,
brightness: 1.0,
})
.add_plugins(DefaultPlugins)
.add_plugins(WebcamFacialPlugin {
config_webcam_device: 0,
config_webcam_width: 640,
config_webcam_height: 480,
config_webcam_framerate: 33,
config_webcam_autostart: true,
config_filter_length: 15,
config_filter_type: SmoothingFilterType::LowPass(0.1),
})
.add_plugins(HookPlugin)
.add_systems(Startup, load_scene)
.add_systems(Update, (keyboard_animation_control, bone_move))
.run();
}
#[derive(Resource, Default)]
struct Average {
x: f32,
y: f32,
}
#[derive(Debug)]
struct Animations(Vec<Handle<AnimationClip>>);
#[derive(Component)]
struct HeadBone;
/// set up 3D scene
fn load_scene(mut cmds: Commands, asset_server: Res<AssetServer>) {
cmds.spawn(HookedSceneBundle {
scene: SceneBundle {
scene: asset_server.load("rooster.gltf#Scene0"),
..default()
},
hook: SceneHook::new(|entity, cmds| {
match entity.get::<Name>().map(|t| t.as_str()) {
Some("Headas") => cmds.insert(HeadBone),
_ => cmds,
};
}),
});
}
fn keyboard_animation_control(
keyboard_input: Res<Input<KeyCode>>,
mut animation_player: Query<&mut AnimationPlayer>,
) {
if let Ok(mut player) = animation_player.get_single_mut() {
if keyboard_input.just_pressed(KeyCode::Space) {
if player.is_paused() {
player.resume();
} else {
player.pause();
}
}
if keyboard_input.just_pressed(KeyCode::Up) {}
}
}
fn bone_move(
mut head: Query<&mut Transform, With<HeadBone>>,
mut average: ResMut<Average>,
mut reader: EventReader<WebcamFacialDataEvent>,
) {
for event in reader.iter() {
let x = event.0.center_x as f32;
let y = event.0.center_y as f32;
average.x = (x + average.x) / 2.0;
average.y = (y + average.y) / 2.0;
for mut head in head.iter_mut() {
head.translation += 0.005;
}
}
}