base the maximum targeting angle on the angular diameter of the object
This commit is contained in:
parent
c8340c4890
commit
9694ebfecd
|
@ -346,8 +346,6 @@ pub fn find_closest_target<TargetSpecifier>(
|
||||||
let mut closest_distance: f32 = f32::MAX;
|
let mut closest_distance: f32 = f32::MAX;
|
||||||
let target_vector = (camera_transform.rotation * Vec3::new(0.0, 0.0, -1.0))
|
let target_vector = (camera_transform.rotation * Vec3::new(0.0, 0.0, -1.0))
|
||||||
.normalize_or_zero();
|
.normalize_or_zero();
|
||||||
let field_of_view = 20.0f32.to_radians();
|
|
||||||
let max_angle = field_of_view / 2.0;
|
|
||||||
for (entity, trans) in objects {
|
for (entity, trans) in objects {
|
||||||
// Use Transform instead of Position because we're basing this
|
// 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.
|
// not on the player mesh but on the camera, which doesn't have a position.
|
||||||
|
@ -355,10 +353,18 @@ pub fn find_closest_target<TargetSpecifier>(
|
||||||
.normalize_or_zero();
|
.normalize_or_zero();
|
||||||
let cosine_of_angle = target_vector.dot(pos_vector);
|
let cosine_of_angle = target_vector.dot(pos_vector);
|
||||||
let angle = cosine_of_angle.acos();
|
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!
|
// It's in the field of view!
|
||||||
//commands.entity(entity).insert(IsTargeted);
|
//commands.entity(entity).insert(IsTargeted);
|
||||||
let distance = trans.translation.distance(camera_transform.translation);
|
|
||||||
if distance < closest_distance {
|
if distance < closest_distance {
|
||||||
closest_distance = distance;
|
closest_distance = distance;
|
||||||
closest_entity = Some(entity);
|
closest_entity = Some(entity);
|
||||||
|
|
Loading…
Reference in a new issue