//! Skinned mesh example with mesh and joints data loaded from a glTF file. //! Example taken from use std::f32::consts::*; use bevy::{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) { // Create a camera commands.spawn(Camera3dBundle { transform: Transform::from_xyz(-2.0, 2.5, 5.0) .looking_at(Vec3::new(0.0, 1.0, 0.0), Vec3::Y), ..default() }); // Spawn the first scene in `models/SimpleSkin/SimpleSkin.gltf` commands.spawn(SceneBundle { scene: asset_server .load(GltfAssetLabel::Scene(0).from_asset("models/SimpleSkin/SimpleSkin.gltf")), ..default() }); } /// The scene hierarchy currently looks somewhat like this: /// /// ```text /// /// + Mesh node (without `PbrBundle` or `SkinnedMesh` component) /// + Skinned mesh entity (with `PbrBundle` and `SkinnedMesh` component, created by glTF loader) /// + First joint /// + Second joint /// ``` /// /// In this example, we want to get and animate the second joint. /// It is similar to the animation defined in `models/SimpleSkin/SimpleSkin.gltf`. fn joint_animation( time: Res