use std::f32::consts::*;
use bevy::{math::ops, prelude::*, render::mesh::skinning::SkinnedMesh};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(AmbientLight {
brightness: 750.0,
..default()
})
.add_systems(Startup, setup)
.add_systems(Update, joint_animation)
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn((
Camera3d::default(),
Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::new(0.0, 1.0, 0.0), Vec3::Y),
));
commands.spawn(SceneRoot(asset_server.load(
GltfAssetLabel::Scene(0).from_asset("models/SimpleSkin/SimpleSkin.gltf"),
)));
}
fn joint_animation(
time: Res<Time>,
parent_query: Query<&Parent, With<SkinnedMesh>>,
children_query: Query<&Children>,
mut transform_query: Query<&mut Transform>,
) {
for skinned_mesh_parent in &parent_query {
let mesh_node_entity = skinned_mesh_parent.get();
let mesh_node_children = children_query.get(mesh_node_entity).unwrap();
let first_joint_entity = mesh_node_children[1];
let first_joint_children = children_query.get(first_joint_entity).unwrap();
let second_joint_entity = first_joint_children[0];
let mut second_joint_transform = transform_query.get_mut(second_joint_entity).unwrap();
second_joint_transform.rotation =
Quat::from_rotation_z(FRAC_PI_2 * ops::sin(time.elapsed_secs()));
}
}