From eb863bb2aa037b40b1e7f3fa3c7c882da61b6055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Tue, 8 Apr 2025 18:11:01 -0300 Subject: [PATCH] Snap - Filter out 2D bounding boxes that are too far from the camera view. --- src/bonsai/bonsai/tool/raycast.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 9f4c6fda19..e7ab5a5b17 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -65,6 +65,8 @@ class Raycast(bonsai.core.tool.Raycast): def get_on_screen_2d_bounding_boxes( cls, context: bpy.types.Context, obj: bpy.types.Object ) -> Union[tuple[bpy.types.Object, list[float]], None]: + rv3d = context.region_data + view_location = rv3d.view_matrix.inverted().translation obj_matrix = obj.matrix_world.copy() bbox = [obj_matrix @ Vector(v) for v in obj.bound_box] @@ -75,6 +77,19 @@ class Raycast(bonsai.core.tool.Raycast): assert isinstance(context.space_data, bpy.types.SpaceView3D) assert context.space_data.region_3d + # Do not include objects too far from camera view + if rv3d.view_perspective == "PERSP": + threshold = 200 + min_distance = float('inf') + closest_distance: float = None + for point in bbox: + distance = (view_location - point).length + if distance < min_distance: + min_distance = distance + closest_distance = distance + if closest_distance > threshold: + return None + for v in bbox: coord_2d = view3d_utils.location_3d_to_region_2d(context.region, context.space_data.region_3d, v) if coord_2d is not None: