|
""" |
|
3D utility functions workings with NumPy. |
|
""" |
|
import importlib |
|
import itertools |
|
import numpy |
|
|
|
|
|
__modules_all__ = { |
|
'mesh':[ |
|
'triangulate', |
|
'compute_face_normal', |
|
'compute_face_angle', |
|
'compute_vertex_normal', |
|
'compute_vertex_normal_weighted', |
|
'remove_corrupted_faces', |
|
'merge_duplicate_vertices', |
|
'remove_unreferenced_vertices', |
|
'subdivide_mesh_simple', |
|
'mesh_relations', |
|
'flatten_mesh_indices' |
|
], |
|
'quadmesh': [ |
|
'calc_quad_candidates', |
|
'calc_quad_distortion', |
|
'calc_quad_direction', |
|
'calc_quad_smoothness', |
|
'sovle_quad', |
|
'sovle_quad_qp', |
|
'tri_to_quad' |
|
], |
|
'utils': [ |
|
'sliding_window_1d', |
|
'sliding_window_nd', |
|
'sliding_window_2d', |
|
'max_pool_1d', |
|
'max_pool_2d', |
|
'max_pool_nd', |
|
'depth_edge', |
|
'depth_aliasing', |
|
'interpolate', |
|
'image_scrcoord', |
|
'image_uv', |
|
'image_pixel_center', |
|
'image_pixel', |
|
'image_mesh', |
|
'image_mesh_from_depth', |
|
'depth_to_normal', |
|
'point_to_normal', |
|
'chessboard', |
|
'cube', |
|
'square', |
|
'camera_frustum', |
|
], |
|
'transforms': [ |
|
'perspective', |
|
'perspective_from_fov', |
|
'perspective_from_fov_xy', |
|
'intrinsics_from_focal_center', |
|
'intrinsics_from_fov', |
|
'view_look_at', |
|
'extrinsics_look_at', |
|
'perspective_to_intrinsics', |
|
'perspective_to_near_far', |
|
'intrinsics_to_perspective', |
|
'extrinsics_to_view', |
|
'view_to_extrinsics', |
|
'normalize_intrinsics', |
|
'crop_intrinsics', |
|
'pixel_to_uv', |
|
'pixel_to_ndc', |
|
'uv_to_pixel', |
|
'project_depth', |
|
'depth_buffer_to_linear', |
|
'unproject_cv', |
|
'unproject_gl', |
|
'project_cv', |
|
'project_gl', |
|
'quaternion_to_matrix', |
|
'axis_angle_to_matrix', |
|
'matrix_to_quaternion', |
|
'extrinsics_to_essential', |
|
'euler_axis_angle_rotation', |
|
'euler_angles_to_matrix', |
|
'skew_symmetric', |
|
'rotation_matrix_from_vectors', |
|
'ray_intersection', |
|
'se3_matrix', |
|
'slerp_quaternion', |
|
'slerp_vector', |
|
'lerp', |
|
'lerp_se3_matrix', |
|
'piecewise_lerp', |
|
'piecewise_lerp_se3_matrix', |
|
'apply_transform' |
|
], |
|
'spline': [ |
|
'linear_spline_interpolate', |
|
], |
|
'rasterization': [ |
|
'RastContext', |
|
'rasterize_triangle_faces', |
|
'rasterize_edges', |
|
'texture', |
|
'warp_image_by_depth', |
|
], |
|
} |
|
|
|
|
|
__all__ = list(itertools.chain(*__modules_all__.values())) |
|
|
|
def __getattr__(name): |
|
try: |
|
return globals()[name] |
|
except KeyError: |
|
pass |
|
|
|
try: |
|
module_name = next(m for m in __modules_all__ if name in __modules_all__[m]) |
|
except StopIteration: |
|
raise AttributeError(f"module '{__name__}' has no attribute '{name}'") |
|
module = importlib.import_module(f'.{module_name}', __name__) |
|
for key in __modules_all__[module_name]: |
|
globals()[key] = getattr(module, key) |
|
|
|
return globals()[name] |
|
|
|
|
|
if __name__ == '__main__': |
|
from .quadmesh import * |
|
from .transforms import * |
|
from .mesh import * |
|
from .utils import * |
|
from .rasterization import * |
|
from .spline import * |