ursus_core/math/
light_frustum.rs1use glam::camera::rh::proj::vulkan::orthographic;
2use glam::camera::rh::view::look_at_mat4;
3
4pub fn compute_light_view_proj(direction: [f32; 3], scene_center: glam::Vec3, scene_radius: f32) -> glam::Mat4 {
5 let dir = glam::Vec3::from(direction).normalize();
6 let light_pos = scene_center - dir * scene_radius;
7
8 let up = [glam::Vec3::Y, glam::Vec3::Z, glam::Vec3::X]
9 .iter()
10 .find(|&&u| dir.cross(u).length() > 0.01)
11 .copied()
12 .unwrap_or(glam::Vec3::Y);
13
14 let view = look_at_mat4(light_pos, scene_center, up);
15 let ortho = orthographic(-scene_radius, scene_radius, -scene_radius, scene_radius, 0.1, scene_radius * 2.0);
16 ortho * view
17}