Generate a list of trimesh line-segment geometries for all frustums of a set of cameras. Args: extrinsics: (N, 3, 4) cam2world intrinsics: (N, 3, 3) intrinsics image_size: (W, H) or (N, 2) per-frame scale: frustum size Returns: list[trimesh.path.Path
(extrinsics, intrinsics, image_size, scale=0.1)
| 74 | |
| 75 | |
| 76 | def build_frustum_geometries(extrinsics, intrinsics, image_size, scale=0.1): |
| 77 | """Generate a list of trimesh line-segment geometries for all frustums of a set of cameras. |
| 78 | |
| 79 | Args: |
| 80 | extrinsics: (N, 3, 4) cam2world |
| 81 | intrinsics: (N, 3, 3) intrinsics |
| 82 | image_size: (W, H) or (N, 2) per-frame |
| 83 | scale: frustum size |
| 84 | |
| 85 | Returns: |
| 86 | list[trimesh.path.Path3D] — one line-segment geometry per camera |
| 87 | """ |
| 88 | import trimesh |
| 89 | |
| 90 | N = len(extrinsics) |
| 91 | geoms = [] |
| 92 | |
| 93 | for i in range(N): |
| 94 | if isinstance(image_size, (list, tuple)) and len(image_size) == 2 and not hasattr(image_size[0], '__len__'): |
| 95 | W, H = image_size |
| 96 | else: |
| 97 | W, H = image_size[i] |
| 98 | |
| 99 | segs = camera_frustum_lines(intrinsics[i], extrinsics[i], W, H, scale) |
| 100 | path = trimesh.load_path(segs) |
| 101 | color = _camera_color(i, N) |
| 102 | if hasattr(path, "colors"): |
| 103 | path.colors = np.tile(color, (len(path.entities), 1)) |
| 104 | geoms.append(path) |
| 105 | |
| 106 | return geoms |
| 107 | |
| 108 | |
| 109 | def _segment_to_cylinder(p0, p1, radius, sections=6): |
no test coverage detected