From c2849ce9bb3d83ac5084dd9a0624aa2eb53311ea Mon Sep 17 00:00:00 2001 From: hofee <64160135+GitHofee@users.noreply.github.com> Date: Sun, 20 Oct 2024 23:45:44 +0800 Subject: [PATCH] fix bug: view_sample --- utils/view_sample_util.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/utils/view_sample_util.py b/utils/view_sample_util.py index 16acf67..7e0eee8 100644 --- a/utils/view_sample_util.py +++ b/utils/view_sample_util.py @@ -123,21 +123,24 @@ class ViewSampleUtil: look_at_point_world = look_at_point_world[:3] cam_position_world = cam_position_world[:3] - forward_vector = look_at_point_world - cam_position_world + forward_vector = cam_position_world - look_at_point_world forward_vector /= np.linalg.norm(forward_vector) up_vector = np.array([0, 0, 1]) dot_product = np.dot(forward_vector, up_vector) angle = np.degrees(np.arccos(dot_product)) + right_vector = np.cross(up_vector, forward_vector) print(angle) - if angle < 110: - target_angle = np.random.uniform(110, 150) + if angle > 90 - min_cam_table_included_degree: + max_angle = 90 - min_cam_table_included_degree + min_angle = max(90 - min_cam_table_included_degree*2, 30) + target_angle = np.random.uniform(min_angle, max_angle) angle_difference = np.radians(target_angle - angle) rotation_axis = np.cross(forward_vector, up_vector) rotation_axis /= np.linalg.norm(rotation_axis) - rotation_matrix = PoseUtil.rotation_matrix_from_axis_angle(rotation_axis, angle_difference) + rotation_matrix = PoseUtil.rotation_matrix_from_axis_angle(rotation_axis, -angle_difference) new_cam_position_world = np.dot(rotation_matrix, cam_position_world - look_at_point_world) + look_at_point_world cam_position_world = new_cam_position_world forward_vector = cam_position_world - look_at_point_world @@ -148,7 +151,10 @@ class ViewSampleUtil: corrected_up_vector = np.cross(forward_vector, right_vector) rotation_matrix = np.array([right_vector, corrected_up_vector, forward_vector]).T else: - rotation_matrix = np.array([right_vector, up_vector, forward_vector]).T + right_vector = np.cross(up_vector, forward_vector) + right_vector /= np.linalg.norm(right_vector) + corrected_up_vector = np.cross(forward_vector, right_vector) + rotation_matrix = np.array([right_vector, corrected_up_vector, forward_vector]).T cam_pose = np.eye(4) cam_pose[:3, :3] = rotation_matrix cam_pose[:3, 3] = cam_position_world @@ -162,7 +168,7 @@ class ViewSampleUtil: cos_angle = np.dot(direction_vector, horizontal_normal) / (np.linalg.norm(direction_vector) * np.linalg.norm(horizontal_normal)) angle = np.arccos(np.clip(cos_angle, -1.0, 1.0)) angle_degree = np.degrees(angle) - if angle_degree > 90 + min_cam_table_included_degree: + if angle_degree < 90 - min_cam_table_included_degree: filtered_cam_poses.append(cam_pose) if random.random() < random_view_ratio: pertube_pose = PoseUtil.get_uniform_pose([0.1, 0.1, 0.1], [3, 3, 3], 0, 180, "cm") @@ -172,7 +178,7 @@ class ViewSampleUtil: cam_points = np.array([cam_pose[:3, 3] for cam_pose in filtered_cam_poses]) _, indices = PtsUtil.fps_downsample_point_cloud(cam_points, max_views, require_idx=True) filtered_cam_poses = [filtered_cam_poses[i] for i in indices] - + return np.array(filtered_cam_poses) @staticmethod