load_gltf/
load_gltf.rs

1//! Loads and renders a glTF file as a scene.
2
3use bevy::{
4    light::{CascadeShadowConfigBuilder, DirectionalLightShadowMap},
5    prelude::*,
6};
7use std::f32::consts::*;
8
9fn main() {
10    App::new()
11        .insert_resource(DirectionalLightShadowMap { size: 4096 })
12        .add_plugins(DefaultPlugins)
13        .add_systems(Startup, setup)
14        .add_systems(Update, animate_light_direction)
15        .run();
16}
17
18fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
19    commands.spawn((
20        Camera3d::default(),
21        Transform::from_xyz(0.7, 0.7, 1.0).looking_at(Vec3::new(0.0, 0.3, 0.0), Vec3::Y),
22        EnvironmentMapLight {
23            diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
24            specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
25            intensity: 250.0,
26            ..default()
27        },
28    ));
29
30    commands.spawn((
31        DirectionalLight {
32            shadows_enabled: true,
33            ..default()
34        },
35        // This is a relatively small scene, so use tighter shadow
36        // cascade bounds than the default for better quality.
37        // We also adjusted the shadow map to be larger since we're
38        // only using a single cascade.
39        CascadeShadowConfigBuilder {
40            num_cascades: 1,
41            maximum_distance: 1.6,
42            ..default()
43        }
44        .build(),
45    ));
46    commands.spawn(SceneRoot(asset_server.load(
47        GltfAssetLabel::Scene(0).from_asset("models/FlightHelmet/FlightHelmet.gltf"),
48    )));
49}
50
51fn animate_light_direction(
52    time: Res<Time>,
53    mut query: Query<&mut Transform, With<DirectionalLight>>,
54) {
55    for mut transform in &mut query {
56        transform.rotation = Quat::from_euler(
57            EulerRot::ZYX,
58            0.0,
59            time.elapsed_secs() * PI / 5.0,
60            -FRAC_PI_4,
61        );
62    }
63}