# EasternJournalist-utils3d **Repository Path**: github_18/eastern-journalist-utils3d ## Basic Information - **Project Name**: EasternJournalist-utils3d - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-19 - **Last Updated**: 2025-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # utils3d A collection of useful functions for 3D computer vision and graphics researchers in Python. - **NumPy / PyTorch pairs**: most functions have both implementations. - **Flat & non-modular**: standalone functions only, no classes, no hierarchies. - **Native types**: always use raw Python / NumPy / PyTorch / SciPy.sparse types. - **Vectorized only**: no Python loops beyond O(log N). > ⚠️ *This repo changes quickly*. *Functions may be added, removed, or modified at any time.* > - Copy code if you only need a single function. > - Use commit id or fork if you need stability. ## Install Install via pip + git ```bash pip install git+https://github.com/EasternJournalist/utils3d.git ``` or clone the repo and install ```bash git clone https://github.com/EasternJournalist/utils3d.git pip install ./utils3d ``` ## Documentation - Use `utils3d.{function}` to call the function automatically selecting the backend based on the input type (Numpy ndarray or Pytorch tensor). - Use `utils3d.{np/pt}.{function}` to specifically call the Numpy or Pytorch version. The links below will take you to the source code of each function with detailed documentation and type hints. ### Transforms | Function | Numpy | Pytorch | | ---- | ---- | ---- | | `utils3d.angle_between`
Calculate the angle between two (batches of) vectors. | [`utils3d.np.angle_between(v1, v2)`](utils3d/numpy/transforms.py#L1367) | [`utils3d.pt.angle_between(v1, v2, eps)`](utils3d/torch/transforms.py#L1315) | | `utils3d.axis_angle_to_matrix`
Convert axis-angle representation (rotation vector) to rotation matrix, whose direction is the axis of rotation and length is the angle of rotation | [`utils3d.np.axis_angle_to_matrix(axis_angle, eps)`](utils3d/numpy/transforms.py#L986) | [`utils3d.pt.axis_angle_to_matrix(axis_angle, eps)`](utils3d/torch/transforms.py#L893) | | `utils3d.axis_angle_to_quaternion`
Convert axis-angle representation (rotation vector) to quaternion (w, x, y, z) | [`utils3d.np.axis_angle_to_quaternion(axis_angle, eps)`](utils3d/numpy/transforms.py#L1013) | [`utils3d.pt.axis_angle_to_quaternion(axis_angle, eps)`](utils3d/torch/transforms.py#L950) | | `utils3d.crop_intrinsics`
Evaluate the new intrinsics after cropping the image | [`utils3d.np.crop_intrinsics(intrinsics, size, cropped_top, cropped_left, cropped_height, cropped_width)`](utils3d/numpy/transforms.py#L400) | [`utils3d.pt.crop_intrinsics(intrinsics, size, cropped_top, cropped_left, cropped_height, cropped_width)`](utils3d/torch/transforms.py#L388) | | `utils3d.depth_buffer_to_linear`
OpenGL depth buffer to linear depth | [`utils3d.np.depth_buffer_to_linear(depth_buffer, near, far)`](utils3d/numpy/transforms.py#L534) | [`utils3d.pt.depth_buffer_to_linear(depth, near, far)`](utils3d/torch/transforms.py#L518) | | `utils3d.depth_linear_to_buffer`
Project linear depth to depth value in screen space | [`utils3d.np.depth_linear_to_buffer(depth, near, far)`](utils3d/numpy/transforms.py#L514) | [`utils3d.pt.depth_linear_to_buffer(depth, near, far)`](utils3d/torch/transforms.py#L499) | | `utils3d.euler_angles_to_matrix`
Convert rotations given as Euler angles in radians to rotation matrices. | [`utils3d.np.euler_angles_to_matrix(euler_angles, convention)`](utils3d/numpy/transforms.py#L935) | [`utils3d.pt.euler_angles_to_matrix(euler_angles, convention)`](utils3d/torch/transforms.py#L770) | | `utils3d.euler_axis_angle_rotation`
Return the rotation matrices for one of the rotations about an axis | [`utils3d.np.euler_axis_angle_rotation(axis, angle)`](utils3d/numpy/transforms.py#L905) | [`utils3d.pt.euler_axis_angle_rotation(axis, angle)`](utils3d/torch/transforms.py#L740) | | `utils3d.extrinsics_look_at`
Get OpenCV extrinsics matrix looking at something | [`utils3d.np.extrinsics_look_at(eye, look_at, up)`](utils3d/numpy/transforms.py#L244) | [`utils3d.pt.extrinsics_look_at(eye, look_at, up)`](utils3d/torch/transforms.py#L253) | | `utils3d.extrinsics_to_essential`
extrinsics matrix `[[R, t] [0, 0, 0, 1]]` such that `x' = R (x - t)` to essential matrix such that `x' E x = 0` | [`utils3d.np.extrinsics_to_essential(extrinsics)`](utils3d/numpy/transforms.py#L883) | [`utils3d.pt.extrinsics_to_essential(extrinsics)`](utils3d/torch/transforms.py#L1121) | | `utils3d.extrinsics_to_view`
OpenCV camera extrinsics to OpenGL view matrix | [`utils3d.np.extrinsics_to_view(extrinsics)`](utils3d/numpy/transforms.py#L333) | [`utils3d.pt.extrinsics_to_view(extrinsics)`](utils3d/torch/transforms.py#L321) | | `utils3d.focal_to_fov`
| [`utils3d.np.focal_to_fov(focal)`](utils3d/numpy/transforms.py#L203) | [`utils3d.pt.focal_to_fov(focal)`](utils3d/torch/transforms.py#L211) | | `utils3d.fov_to_focal`
| [`utils3d.np.fov_to_focal(fov)`](utils3d/numpy/transforms.py#L207) | [`utils3d.pt.fov_to_focal(fov)`](utils3d/torch/transforms.py#L215) | | `utils3d.interpolate_se3_matrix`
Linear interpolation between two SE(3) matrices. | [`utils3d.np.interpolate_se3_matrix(T1, T2, t)`](utils3d/numpy/transforms.py#L1236) | [`utils3d.pt.interpolate_se3_matrix(T1, T2, t)`](utils3d/torch/transforms.py#L1099) | | `utils3d.intrinsics_from_focal_center`
Get OpenCV intrinsics matrix | [`utils3d.np.intrinsics_from_focal_center(fx, fy, cx, cy)`](utils3d/numpy/transforms.py#L133) | [`utils3d.pt.intrinsics_from_focal_center(fx, fy, cx, cy)`](utils3d/torch/transforms.py#L137) | | `utils3d.intrinsics_from_fov`
Get normalized OpenCV intrinsics matrix from given field of view. | [`utils3d.np.intrinsics_from_fov(fov_x, fov_y, fov_max, fov_min, aspect_ratio)`](utils3d/numpy/transforms.py#L159) | [`utils3d.pt.intrinsics_from_fov(fov_x, fov_y, fov_max, fov_min, aspect_ratio)`](utils3d/torch/transforms.py#L167) | | `utils3d.intrinsics_to_fov`
NOTE: approximate FOV by assuming centered principal point | [`utils3d.np.intrinsics_to_fov(intrinsics)`](utils3d/numpy/transforms.py#L211) | [`utils3d.pt.intrinsics_to_fov(intrinsics)`](utils3d/torch/transforms.py#L219) | | `utils3d.intrinsics_to_perspective`
OpenCV intrinsics to OpenGL perspective matrix | [`utils3d.np.intrinsics_to_perspective(intrinsics, near, far)`](utils3d/numpy/transforms.py#L305) | [`utils3d.pt.intrinsics_to_perspective(intrinsics, near, far)`](utils3d/torch/transforms.py#L292) | | `utils3d.lerp`
Linear interpolation between two vectors. | [`utils3d.np.lerp(x1, x2, t)`](utils3d/numpy/transforms.py#L1146) | [`utils3d.pt.lerp(v1, v2, t)`](utils3d/torch/transforms.py#L1036) | | `utils3d.make_affine_matrix`
Make an affine transformation matrix from a linear matrix and a translation vector. | [`utils3d.np.make_affine_matrix(M, t)`](utils3d/numpy/transforms.py#L1127) | [`utils3d.pt.make_affine_matrix(M, t)`](utils3d/torch/transforms.py#L1143) | | `utils3d.matrix_to_axis_angle`
Convert a batch of 3x3 rotation matrices to axis-angle representation (rotation vector) | [`utils3d.np.matrix_to_axis_angle(rot_mat, eps)`](utils3d/numpy/transforms.py#L869) | [`utils3d.pt.matrix_to_axis_angle(rot_mat, eps)`](utils3d/torch/transforms.py#L920) | | `utils3d.matrix_to_euler_angles`
Convert rotations given as rotation matrices to Euler angles in radians. | [`utils3d.np.matrix_to_euler_angles(matrix, convention)`](utils3d/numpy/transforms.py#L1061) | [`utils3d.pt.matrix_to_euler_angles(matrix, convention)`](utils3d/torch/transforms.py#L855) | | `utils3d.matrix_to_quaternion`
Convert 3x3 rotation matrix to quaternion (w, x, y, z) | [`utils3d.np.matrix_to_quaternion(rot_mat, eps)`](utils3d/numpy/transforms.py#L807) | [`utils3d.pt.matrix_to_quaternion(rot_mat, eps)`](utils3d/torch/transforms.py#L965) | | `utils3d.normalize_intrinsics`
Normalize intrinsics from pixel cooridnates to uv coordinates | [`utils3d.np.normalize_intrinsics(intrinsics, size, pixel_definition)`](utils3d/numpy/transforms.py#L359) | [`utils3d.pt.normalize_intrinsics(intrinsics, size, pixel_definition)`](utils3d/torch/transforms.py#L347) | | `utils3d.perspective_from_fov`
Get OpenGL perspective matrix from field of view | [`utils3d.np.perspective_from_fov(fov_x, fov_y, fov_min, fov_max, aspect_ratio, near, far)`](utils3d/numpy/transforms.py#L64) | [`utils3d.pt.perspective_from_fov(fov_x, fov_y, fov_min, fov_max, aspect_ratio, near, far)`](utils3d/torch/transforms.py#L66) | | `utils3d.perspective_from_window`
Get OpenGL perspective matrix from the window of z=-1 projection plane | [`utils3d.np.perspective_from_window(left, right, bottom, top, near, far)`](utils3d/numpy/transforms.py#L106) | [`utils3d.pt.perspective_from_window(left, right, bottom, top, near, far)`](utils3d/torch/transforms.py#L110) | | `utils3d.perspective_to_intrinsics`
OpenGL perspective matrix to OpenCV intrinsics | [`utils3d.np.perspective_to_intrinsics(perspective)`](utils3d/numpy/transforms.py#L277) | [`utils3d.pt.perspective_to_intrinsics(perspective)`](utils3d/torch/transforms.py#L274) | | `utils3d.perspective_to_near_far`
Get near and far planes from OpenGL perspective matrix | [`utils3d.np.perspective_to_near_far(perspective)`](utils3d/numpy/transforms.py#L294) | - | | `utils3d.piecewise_interpolate_se3_matrix`
Linear spline interpolation for SE(3) matrices. | [`utils3d.np.piecewise_interpolate_se3_matrix(T, t, s, extrapolation_mode)`](utils3d/numpy/transforms.py#L1285) | - | | `utils3d.piecewise_lerp`
Linear spline interpolation. | [`utils3d.np.piecewise_lerp(x, t, s, extrapolation_mode)`](utils3d/numpy/transforms.py#L1256) | - | | `utils3d.pixel_to_ndc`
Convert pixel coordinates to NDC (Normalized Device Coordinates). | [`utils3d.np.pixel_to_ndc(pixel, size, pixel_definition)`](utils3d/numpy/transforms.py#L486) | [`utils3d.pt.pixel_to_ndc(pixel, size, pixel_definition)`](utils3d/torch/transforms.py#L472) | | `utils3d.pixel_to_uv`
Convert pixel space coordiantes to UV space coordinates. | [`utils3d.np.pixel_to_uv(pixel, size, pixel_definition)`](utils3d/numpy/transforms.py#L436) | [`utils3d.pt.pixel_to_uv(pixel, size, pixel_definition)`](utils3d/torch/transforms.py#L424) | | `utils3d.project`
Calculate projection. | [`utils3d.np.project(points, intrinsics, extrinsics, view, projection)`](utils3d/numpy/transforms.py#L699) | [`utils3d.pt.project(points, intrinsics, extrinsics, view, projection)`](utils3d/torch/transforms.py#L657) | | `utils3d.project_cv`
Project 3D points to 2D following the OpenCV convention | [`utils3d.np.project_cv(points, intrinsics, extrinsics)`](utils3d/numpy/transforms.py#L583) | [`utils3d.pt.project_cv(points, intrinsics, extrinsics)`](utils3d/torch/transforms.py#L566) | | `utils3d.project_gl`
Project 3D points to 2D following the OpenGL convention (except for row major matrices) | [`utils3d.np.project_gl(points, projection, view)`](utils3d/numpy/transforms.py#L554) | [`utils3d.pt.project_gl(points, projection, view)`](utils3d/torch/transforms.py#L537) | | `utils3d.quaternion_to_axis_angle`
Convert a batch of quaternions (w, x, y, z) to axis-angle representation (rotation vector) | [`utils3d.np.quaternion_to_axis_angle(quaternion, eps)`](utils3d/numpy/transforms.py#L853) | [`utils3d.pt.quaternion_to_axis_angle(quaternion, eps)`](utils3d/torch/transforms.py#L934) | | `utils3d.quaternion_to_matrix`
Converts a batch of quaternions (w, x, y, z) to rotation matrices | [`utils3d.np.quaternion_to_matrix(quaternion, eps)`](utils3d/numpy/transforms.py#L782) | [`utils3d.pt.quaternion_to_matrix(quaternion, eps)`](utils3d/torch/transforms.py#L1011) | | `utils3d.ray_intersection`
Compute the intersection/closest point of two D-dimensional rays | [`utils3d.np.ray_intersection(p1, d1, p2, d2)`](utils3d/numpy/transforms.py#L1099) | - | | `utils3d.rotate_2d`
3x3 matrix for 2D rotation around a center | - | [`utils3d.pt.rotate_2d(theta, center)`](utils3d/torch/transforms.py#L1179) | | `utils3d.rotation_matrix_2d`
2x2 matrix for 2D rotation | - | [`utils3d.pt.rotation_matrix_2d(theta)`](utils3d/torch/transforms.py#L1161) | | `utils3d.rotation_matrix_from_vectors`
Rotation matrix that rotates v1 to v2 | [`utils3d.np.rotation_matrix_from_vectors(v1, v2)`](utils3d/numpy/transforms.py#L974) | [`utils3d.pt.rotation_matrix_from_vectors(v1, v2)`](utils3d/torch/transforms.py#L810) | | `utils3d.scale_2d`
Scale matrix for 2D scaling | - | [`utils3d.pt.scale_2d(scale, center)`](utils3d/torch/transforms.py#L1233) | | `utils3d.screen_coord_to_view_coord`
Unproject screen space coordinates to 3D view space following the OpenGL convention (except for row major matrices) | [`utils3d.np.screen_coord_to_view_coord(screen_coord, projection)`](utils3d/numpy/transforms.py#L645) | - | | `utils3d.skew_symmetric`
Skew symmetric matrix from a 3D vector | [`utils3d.np.skew_symmetric(v)`](utils3d/numpy/transforms.py#L962) | [`utils3d.pt.skew_symmetric(v)`](utils3d/torch/transforms.py#L798) | | `utils3d.slerp`
Spherical linear interpolation between two unit vectors. The vectors are assumed to be normalized. | [`utils3d.np.slerp(v1, v2, t)`](utils3d/numpy/transforms.py#L1190) | [`utils3d.pt.slerp(v1, v2, t, eps)`](utils3d/torch/transforms.py#L1053) | | `utils3d.slerp_rotation_matrix`
Spherical linear interpolation between two rotation matrices. | [`utils3d.np.slerp_rotation_matrix(R1, R2, t)`](utils3d/numpy/transforms.py#L1216) | [`utils3d.pt.slerp_rotation_matrix(R1, R2, t)`](utils3d/torch/transforms.py#L1079) | | `utils3d.transform`
Apply affine transformation(s) to a point or a set of points. | [`utils3d.np.transform(x, Ts)`](utils3d/numpy/transforms.py#L1314) | [`utils3d.pt.transform(x, Ts)`](utils3d/torch/transforms.py#L1263) | | `utils3d.translate_2d`
Translation matrix for 2D translation | - | [`utils3d.pt.translate_2d(translation)`](utils3d/torch/transforms.py#L1210) | | `utils3d.unproject`
Calculate inverse projection. | [`utils3d.np.unproject(uv, depth, intrinsics, extrinsics, projection, view)`](utils3d/numpy/transforms.py#L740) | [`utils3d.pt.unproject(uv, depth, intrinsics, extrinsics, projection, view)`](utils3d/torch/transforms.py#L698) | | `utils3d.unproject_cv`
Unproject uv coordinates to 3D view space following the OpenCV convention | [`utils3d.np.unproject_cv(uv, depth, intrinsics, extrinsics)`](utils3d/numpy/transforms.py#L666) | [`utils3d.pt.unproject_cv(uv, depth, intrinsics, extrinsics)`](utils3d/torch/transforms.py#L626) | | `utils3d.unproject_gl`
Unproject screen space coordinates to 3D view space following the OpenGL convention (except for row major matrices) | [`utils3d.np.unproject_gl(uv, depth, projection, view)`](utils3d/numpy/transforms.py#L615) | [`utils3d.pt.unproject_gl(uv, depth, projection, view)`](utils3d/torch/transforms.py#L596) | | `utils3d.uv_to_pixel`
Convert UV space coordinates to pixel space coordinates. | [`utils3d.np.uv_to_pixel(uv, size, pixel_definition)`](utils3d/numpy/transforms.py#L462) | [`utils3d.pt.uv_to_pixel(uv, size, pixel_definition)`](utils3d/torch/transforms.py#L448) | | `utils3d.view_look_at`
Get OpenGL view matrix looking at something | [`utils3d.np.view_look_at(eye, look_at, up)`](utils3d/numpy/transforms.py#L217) | [`utils3d.pt.view_look_at(eye, look_at, up)`](utils3d/torch/transforms.py#L226) | | `utils3d.view_to_extrinsics`
OpenGL view matrix to OpenCV camera extrinsics | [`utils3d.np.view_to_extrinsics(view)`](utils3d/numpy/transforms.py#L346) | [`utils3d.pt.view_to_extrinsics(view)`](utils3d/torch/transforms.py#L334) | ### Maps | Function | Numpy | Pytorch | | ---- | ---- | ---- | | `utils3d.bounding_rect_from_mask`
Get bounding rectangle of a mask | - | [`utils3d.pt.bounding_rect_from_mask(mask)`](utils3d/torch/maps.py#L366) | | `utils3d.build_mesh_from_depth_map`
Get a mesh by lifting depth map to 3D, while removing depths of large depth difference. | [`utils3d.np.build_mesh_from_depth_map(depth, other_maps, intrinsics, extrinsics, atol, rtol, tri)`](utils3d/numpy/maps.py#L187) | [`utils3d.pt.build_mesh_from_depth_map(depth, other_maps, intrinsics, extrinsics, atol, rtol, tri)`](utils3d/torch/maps.py#L197) | | `utils3d.build_mesh_from_map`
Get a mesh regarding image pixel uv coordinates as vertices and image grid as faces. | [`utils3d.np.build_mesh_from_map(maps, mask, tri)`](utils3d/numpy/maps.py#L154) | [`utils3d.pt.build_mesh_from_map(maps, mask, tri)`](utils3d/torch/maps.py#L158) | | `utils3d.chessboard`
Get a chessboard image | [`utils3d.np.chessboard(size, grid_size, color_a, color_b)`](utils3d/numpy/maps.py#L425) | [`utils3d.pt.chessboard(size, grid_size, color_a, color_b)`](utils3d/torch/maps.py#L383) | | `utils3d.colorize_depth_map`
Colorize depth map for visualization. | [`utils3d.np.colorize_depth_map(depth, mask, normalize, cmap)`](utils3d/numpy/maps.py#L586) | - | | `utils3d.colorize_normal_map`
Colorize normal map for visualization. Value range is [-1, 1]. | [`utils3d.np.colorize_normal_map(normal, mask, flip_yz)`](utils3d/numpy/maps.py#L613) | - | | `utils3d.depth_map_aliasing`
Compute the map that indicates the aliasing of x depth map, identifying pixels which neither close to the maximum nor the minimum of its neighbors. | [`utils3d.np.depth_map_aliasing(depth, atol, rtol, kernel_size, mask)`](utils3d/numpy/maps.py#L256) | [`utils3d.pt.depth_map_aliasing(depth, atol, rtol, kernel_size, mask)`](utils3d/torch/maps.py#L265) | | `utils3d.depth_map_edge`
Compute the edge mask from depth map. The edge is defined as the pixels whose neighbors have large difference in depth. | [`utils3d.np.depth_map_edge(depth, atol, rtol, kernel_size, mask)`](utils3d/numpy/maps.py#L229) | [`utils3d.pt.depth_map_edge(depth, atol, rtol, kernel_size, mask)`](utils3d/torch/maps.py#L239) | | `utils3d.depth_map_to_normal_map`
Calculate normal map from depth map. Value range is [-1, 1]. Normal direction in OpenCV identity camera's coordinate system. | [`utils3d.np.depth_map_to_normal_map(depth, intrinsics, mask, edge_threshold)`](utils3d/numpy/maps.py#L379) | [`utils3d.pt.depth_map_to_normal_map(depth, intrinsics, mask)`](utils3d/torch/maps.py#L344) | | `utils3d.depth_map_to_point_map`
Unproject depth map to 3D points. | [`utils3d.np.depth_map_to_point_map(depth, intrinsics, extrinsics)`](utils3d/numpy/maps.py#L399) | [`utils3d.pt.depth_map_to_point_map(depth, intrinsics, extrinsics)`](utils3d/torch/maps.py#L359) | | `utils3d.masked_area_resize`
Resize 2D map by area sampling with mask awareness. | [`utils3d.np.masked_area_resize(image, mask, size)`](utils3d/numpy/maps.py#L518) | [`utils3d.pt.masked_area_resize(image, mask, size)`](utils3d/torch/maps.py#L477) | | `utils3d.masked_nearest_resize`
Resize image(s) by nearest sampling with mask awareness. | [`utils3d.np.masked_nearest_resize(image, mask, size, return_index)`](utils3d/numpy/maps.py#L448) | [`utils3d.pt.masked_nearest_resize(image, mask, size, return_index)`](utils3d/torch/maps.py#L406) | | `utils3d.normal_map_edge`
Compute the edge mask from normal map. | [`utils3d.np.normal_map_edge(normals, tol, kernel_size, mask)`](utils3d/numpy/maps.py#L284) | - | | `utils3d.pixel_coord_map`
Get image pixel coordinates map, where (0, 0) is the top-left corner of the top-left pixel, and (width, height) is the bottom-right corner of the bottom-right pixel. | [`utils3d.np.pixel_coord_map(size, top, left, definition, dtype)`](utils3d/numpy/maps.py#L73) | [`utils3d.pt.pixel_coord_map(size, top, left, definition, dtype, device)`](utils3d/torch/maps.py#L75) | | `utils3d.point_map_to_normal_map`
Calculate normal map from point map. Value range is [-1, 1]. | [`utils3d.np.point_map_to_normal_map(point, mask, edge_threshold)`](utils3d/numpy/maps.py#L322) | [`utils3d.pt.point_map_to_normal_map(point, mask)`](utils3d/torch/maps.py#L299) | | `utils3d.screen_coord_map`
Get screen space coordinate map, where (0., 0.) is the bottom-left corner of the image, and (1., 1.) is the top-right corner of the image. | [`utils3d.np.screen_coord_map(size, top, left, bottom, right, dtype)`](utils3d/numpy/maps.py#L121) | [`utils3d.pt.screen_coord_map(size, top, left, bottom, right, dtype, device)`](utils3d/torch/maps.py#L124) | | `utils3d.uv_map`
Get image UV space coordinate map, where (0., 0.) is the top-left corner of the image, and (1., 1.) is the bottom-right corner of the image. | [`utils3d.np.uv_map(size, top, left, bottom, right, dtype)`](utils3d/numpy/maps.py#L32) | [`utils3d.pt.uv_map(size, top, left, bottom, right, dtype, device)`](utils3d/torch/maps.py#L32) | ### Mesh | Function | Numpy | Pytorch | | ---- | ---- | ---- | | `utils3d.compute_boundaries`
Compute boundary edges of a mesh. | - | [`utils3d.pt.compute_boundaries(faces, edges, face2edge, edge_degrees)`](utils3d/torch/mesh.py#L545) | | `utils3d.compute_face_corner_angles`
Compute face corner angles of a mesh | [`utils3d.np.compute_face_corner_angles(vertices, faces)`](utils3d/numpy/mesh.py#L91) | [`utils3d.pt.compute_face_corner_angles(vertices, faces)`](utils3d/torch/mesh.py#L120) | | `utils3d.compute_face_corner_normals`
Compute the face corner normals of a mesh | [`utils3d.np.compute_face_corner_normals(vertices, faces, normalize)`](utils3d/numpy/mesh.py#L112) | [`utils3d.pt.compute_face_corner_normals(vertices, faces, normalize)`](utils3d/torch/mesh.py#L142) | | `utils3d.compute_face_corner_tangents`
Compute the face corner tangent (and bitangent) vectors of a mesh | [`utils3d.np.compute_face_corner_tangents(vertices, uv, faces_vertices, faces_uv, normalize)`](utils3d/numpy/mesh.py#L137) | [`utils3d.pt.compute_face_corner_tangents(vertices, uv, faces_vertices, faces_uv, normalize)`](utils3d/torch/mesh.py#L167) | | `utils3d.compute_face_normals`
Compute face normals of a mesh | [`utils3d.np.compute_face_normals(vertices, faces)`](utils3d/numpy/mesh.py#L173) | [`utils3d.pt.compute_face_normals(vertices, faces)`](utils3d/torch/mesh.py#L203) | | `utils3d.compute_face_tangents`
Compute the face corner tangent (and bitangent) vectors of a mesh | [`utils3d.np.compute_face_tangents(vertices, uv, faces_vertices, faces_uv, normalize)`](utils3d/numpy/mesh.py#L201) | [`utils3d.pt.compute_face_tangents(vertices, uv, faces_vertices, faces_uv, normalize)`](utils3d/torch/mesh.py#L231) | | `utils3d.compute_mesh_laplacian`
Laplacian smooth with cotangent weights | - | [`utils3d.pt.compute_mesh_laplacian(vertices, faces, weight)`](utils3d/torch/mesh.py#L790) | | `utils3d.compute_vertex_normals`
Compute vertex normals of a triangular mesh by averaging neighboring face normals | [`utils3d.np.compute_vertex_normals(vertices, faces, weighted)`](utils3d/numpy/mesh.py#L237) | - | | `utils3d.create_camera_frustum_mesh`
Create a triangle mesh of camera frustum. | [`utils3d.np.create_camera_frustum_mesh(extrinsics, intrinsics, depth)`](utils3d/numpy/mesh.py#L457) | - | | `utils3d.create_cube_mesh`
Create a cube mesh of size 1 centered at origin. | [`utils3d.np.create_cube_mesh(tri)`](utils3d/numpy/mesh.py#L426) | - | | `utils3d.create_icosahedron_mesh`
Create an icosahedron mesh of centered at origin. | [`utils3d.np.create_icosahedron_mesh()`](utils3d/numpy/mesh.py#L483) | - | | `utils3d.create_square_mesh`
Create a square mesh of area 1 centered at origin in the xy-plane. | [`utils3d.np.create_square_mesh(tri)`](utils3d/numpy/mesh.py#L408) | - | | `utils3d.flatten_mesh_indices`
| [`utils3d.np.flatten_mesh_indices(args)`](utils3d/numpy/mesh.py#L395) | - | | `utils3d.graph_connected_components`
Compute connected components of an undirected graph. | [`utils3d.np.graph_connected_components(edges, num_vertices)`](utils3d/numpy/mesh.py#L724) | [`utils3d.pt.graph_connected_components(edges, num_vertices)`](utils3d/torch/mesh.py#L496) | | `utils3d.laplacian_hc_smooth_mesh`
HC algorithm from Improved Laplacian Smoothing of Noisy Surface Meshes by J.Vollmer et al. | - | [`utils3d.pt.laplacian_hc_smooth_mesh(vertices, faces, times, alpha, beta, weight)`](utils3d/torch/mesh.py#L849) | | `utils3d.laplacian_smooth_mesh`
Laplacian smooth with cotangent weights | - | [`utils3d.pt.laplacian_smooth_mesh(vertices, faces, weight, times)`](utils3d/torch/mesh.py#L819) | | `utils3d.merge_duplicate_vertices`
Merge duplicate vertices of a triangular mesh. | [`utils3d.np.merge_duplicate_vertices(vertices, faces, tol)`](utils3d/numpy/mesh.py#L285) | [`utils3d.pt.merge_duplicate_vertices(vertices, faces, tol)`](utils3d/torch/mesh.py#L668) | | `utils3d.merge_meshes`
Merge multiple meshes into one mesh. Vertices will be no longer shared. | [`utils3d.np.merge_meshes(meshes)`](utils3d/numpy/mesh.py#L502) | - | | `utils3d.mesh_adjacency_graph`
Get adjacency graph of a mesh. | [`utils3d.np.mesh_adjacency_graph(adjacency, faces, edges, num_vertices, self_loop)`](utils3d/numpy/mesh.py#L764) | - | | `utils3d.mesh_connected_components`
Compute connected faces of a mesh. | [`utils3d.np.mesh_connected_components(faces, num_vertices)`](utils3d/numpy/mesh.py#L698) | [`utils3d.pt.mesh_connected_components(faces, num_vertices)`](utils3d/torch/mesh.py#L473) | | `utils3d.mesh_dual_graph`
Get dual graph of a mesh. (Mesh face as dual graph's vertex, adjacency by edge sharing) | - | [`utils3d.pt.mesh_dual_graph(faces)`](utils3d/torch/mesh.py#L601) | | `utils3d.mesh_edges`
Get undirected edges of a mesh. Optionally return additional mappings. | [`utils3d.np.mesh_edges(faces, return_face2edge, return_edge2face, return_counts)`](utils3d/numpy/mesh.py#L526) | [`utils3d.pt.mesh_edges(faces, return_face2edge, return_edge2face, return_counts)`](utils3d/torch/mesh.py#L298) | | `utils3d.mesh_half_edges`
Get half edges of a mesh. Optionally return additional mappings. | [`utils3d.np.mesh_half_edges(faces, return_face2edge, return_edge2face, return_twin, return_next, return_prev, return_counts)`](utils3d/numpy/mesh.py#L597) | [`utils3d.pt.mesh_half_edges(faces, return_face2edge, return_edge2face, return_twin, return_next, return_prev, return_counts)`](utils3d/torch/mesh.py#L372) | | `utils3d.remove_corrupted_faces`
Remove corrupted faces (faces with duplicated vertices) | [`utils3d.np.remove_corrupted_faces(faces)`](utils3d/numpy/mesh.py#L271) | [`utils3d.pt.remove_corrupted_faces(faces)`](utils3d/torch/mesh.py#L652) | | `utils3d.remove_isolated_pieces`
Remove isolated pieces of a mesh. | - | [`utils3d.pt.remove_isolated_pieces(vertices, faces, connected_components, thresh_num_faces, thresh_radius, thresh_boundary_ratio, remove_unreferenced)`](utils3d/torch/mesh.py#L693) | | `utils3d.remove_unused_vertices`
Remove unreferenced vertices of a mesh. | [`utils3d.np.remove_unused_vertices(faces, vertice_attrs, return_indices)`](utils3d/numpy/mesh.py#L310) | [`utils3d.pt.remove_unused_vertices(faces, vertice_attrs, return_indices)`](utils3d/torch/mesh.py#L623) | | `utils3d.subdivide_mesh`
Subdivide a triangular mesh by splitting each triangle into 4 smaller triangles. | [`utils3d.np.subdivide_mesh(vertices, faces, level)`](utils3d/numpy/mesh.py#L339) | [`utils3d.pt.subdivide_mesh(vertices, faces, n)`](utils3d/torch/mesh.py#L759) | | `utils3d.taubin_smooth_mesh`
Taubin smooth mesh | - | [`utils3d.pt.taubin_smooth_mesh(vertices, faces, lambda_, mu_)`](utils3d/torch/mesh.py#L832) | | `utils3d.triangulate_mesh`
Triangulate a polygonal mesh. | [`utils3d.np.triangulate_mesh(faces, vertices, method)`](utils3d/numpy/mesh.py#L43) | [`utils3d.pt.triangulate_mesh(faces, vertices, method)`](utils3d/torch/mesh.py#L72) | ### Rasterization | Function | Numpy | Pytorch | | ---- | ---- | ---- | | `utils3d.RastContext`
Context for numpy-side rasterization. Based on moderngl. | [`utils3d.np.RastContext(args, kwargs)`](utils3d/numpy/rasterization.py#L255) | [`utils3d.pt.RastContext(nvd_ctx, backend, device)`](utils3d/torch/rasterization.py#L21) | | `utils3d.rasterize_lines`
Rasterize lines. | [`utils3d.np.rasterize_lines(ctx, size, vertices, lines, attributes, attributes_domain, view, projection, line_width, return_depth, return_interpolation, background_image, background_depth, background_interpolation_id, background_interpolation_uv)`](utils3d/numpy/rasterization.py#L862) | - | | `utils3d.rasterize_point_cloud`
Rasterize point cloud. | [`utils3d.np.rasterize_point_cloud(ctx, size, points, point_sizes, point_size_in, point_shape, attributes, view, projection, return_depth, return_point_id, background_image, background_depth, background_point_id)`](utils3d/numpy/rasterization.py#L1091) | - | | `utils3d.rasterize_triangles`
Rasterize triangles. | [`utils3d.np.rasterize_triangles(ctx, size, vertices, attributes, attributes_domain, faces, view, projection, cull_backface, return_depth, return_interpolation, background_image, background_depth, background_interpolation_id, background_interpolation_uv)`](utils3d/numpy/rasterization.py#L390) | [`utils3d.pt.rasterize_triangles(ctx, width, height, vertices, faces, attr, uv, texture, model, view, projection, antialiasing, diff_attrs)`](utils3d/torch/rasterization.py#L38) | | `utils3d.rasterize_triangles_peeling`
Rasterize triangles with depth peeling. | [`utils3d.np.rasterize_triangles_peeling(ctx, size, vertices, attributes, attributes_domain, faces, view, projection, cull_backface, return_depth, return_interpolation)`](utils3d/numpy/rasterization.py#L620) | [`utils3d.pt.rasterize_triangles_peeling(ctx, vertices, faces, width, height, max_layers, attr, uv, texture, model, view, projection, antialiasing, diff_attrs)`](utils3d/torch/rasterization.py#L145) | | `utils3d.sample_texture`
Sample from a texture map with a UV map. | [`utils3d.np.sample_texture(ctx, uv_map, texture_map, interpolation, mipmap_level, repeat, anisotropic)`](utils3d/numpy/rasterization.py#L1297) | [`utils3d.pt.sample_texture(texture, uv, uv_da)`](utils3d/torch/rasterization.py#L271) | | `utils3d.test_rasterization`
Test if rasterization works. It will render a cube with random colors and save it as a CHECKME.png file. | [`utils3d.np.test_rasterization(ctx)`](utils3d/numpy/rasterization.py#L1459) | - | | `utils3d.texture_composite`
Composite textures with depth peeling output. | - | [`utils3d.pt.texture_composite(texture, uv, uv_da, background)`](utils3d/torch/rasterization.py#L291) | | `utils3d.warp_image_by_depth`
Warp image by depth. | - | [`utils3d.pt.warp_image_by_depth(ctx, depth, image, mask, width, height, extrinsics_src, extrinsics_tgt, intrinsics_src, intrinsics_tgt, near, far, antialiasing, backslash, padding, return_uv, return_dr)`](utils3d/torch/rasterization.py#L332) | | `utils3d.warp_image_by_forward_flow`
Warp image by forward flow. | - | [`utils3d.pt.warp_image_by_forward_flow(ctx, image, flow, depth, antialiasing, backslash)`](utils3d/torch/rasterization.py#L502) | ### Utils | Function | Numpy | Pytorch | | ---- | ---- | ---- | | `utils3d.csr_eliminate_zeros`
Remove zero elements from a sparse CSR tensor. | - | [`utils3d.pt.csr_eliminate_zeros(input)`](utils3d/torch/utils.py#L165) | | `utils3d.csr_matrix_from_dense_indices`
Convert a regular indices array to a sparse CSR adjacency matrix format | [`utils3d.np.csr_matrix_from_dense_indices(indices, n_cols)`](utils3d/numpy/utils.py#L168) | [`utils3d.pt.csr_matrix_from_dense_indices(indices, n_cols)`](utils3d/torch/utils.py#L146) | | `utils3d.lookup`
Look up `query` in `key` like a dictionary. Useful for COO indexing. | [`utils3d.np.lookup(key, query, value, default_value)`](utils3d/numpy/utils.py#L128) | [`utils3d.pt.lookup(key, query, value, default_value)`](utils3d/torch/utils.py#L115) | | `utils3d.masked_max`
Similar to torch.max, but with mask | - | [`utils3d.pt.masked_max(input, mask, dim, keepdim)`](utils3d/torch/utils.py#L106) | | `utils3d.masked_min`
Similar to torch.min, but with mask | - | [`utils3d.pt.masked_min(input, mask, dim, keepdim)`](utils3d/torch/utils.py#L97) | | `utils3d.max_pool_1d`
| [`utils3d.np.max_pool_1d(x, kernel_size, stride, padding, axis)`](utils3d/numpy/utils.py#L100) | - | | `utils3d.max_pool_2d`
| [`utils3d.np.max_pool_2d(x, kernel_size, stride, padding, axis)`](utils3d/numpy/utils.py#L117) | - | | `utils3d.max_pool_nd`
| [`utils3d.np.max_pool_nd(x, kernel_size, stride, padding, axis)`](utils3d/numpy/utils.py#L111) | - | | `utils3d.segment_roll`
Roll the data tensor within each segment defined by offsets. | [`utils3d.np.segment_roll(data, offsets, shift)`](utils3d/numpy/utils.py#L158) | [`utils3d.pt.segment_roll(data, offsets, shift)`](utils3d/torch/utils.py#L182) | | `utils3d.sliding_window`
Get a sliding window of the input array. | [`utils3d.np.sliding_window(x, window_size, stride, pad_size, pad_mode, pad_value, axis)`](utils3d/numpy/utils.py#L23) | [`utils3d.pt.sliding_window(x, window_size, stride, pad_size, pad_mode, pad_value, dim)`](utils3d/torch/utils.py#L25) | | `utils3d.split_groups_by_labels`
Split the data into groups based on the provided labels. | [`utils3d.np.split_groups_by_labels(labels, data)`](utils3d/numpy/utils.py#L185) | [`utils3d.pt.split_groups_by_labels(labels, data)`](utils3d/torch/utils.py#L211) |