From 9694ebfecd602fbf93dfbb46a62810a6ae236ae5 Mon Sep 17 00:00:00 2001 From: hut Date: Fri, 5 Apr 2024 20:28:28 +0200 Subject: [PATCH] base the maximum targeting angle on the angular diameter of the object --- src/camera.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/camera.rs b/src/camera.rs index ae48570..2d5c2dc 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -346,8 +346,6 @@ pub fn find_closest_target( let mut closest_distance: f32 = f32::MAX; let target_vector = (camera_transform.rotation * Vec3::new(0.0, 0.0, -1.0)) .normalize_or_zero(); - let field_of_view = 20.0f32.to_radians(); - let max_angle = field_of_view / 2.0; for (entity, trans) in objects { // Use Transform instead of Position because we're basing this // not on the player mesh but on the camera, which doesn't have a position. @@ -355,10 +353,18 @@ pub fn find_closest_target( .normalize_or_zero(); let cosine_of_angle = target_vector.dot(pos_vector); let angle = cosine_of_angle.acos(); - if angle <= max_angle { + let distance = trans.translation.distance(camera_transform.translation); + let leeway = 1.3; + let angular_diameter = if distance > 0.0 { + // Angular Diameter + leeway * (trans.scale[0] / distance).asin() + } + else { + 0.0 + }; + if angle <= angular_diameter.clamp(0.001, PI) { // It's in the field of view! //commands.entity(entity).insert(IsTargeted); - let distance = trans.translation.distance(camera_transform.translation); if distance < closest_distance { closest_distance = distance; closest_entity = Some(entity);