robogym/utils/mesh.py (15 lines of code) (raw):
from typing import Tuple
import numpy as np
import trimesh
def get_vertices_bounding_box(vertices: np.ndarray) -> Tuple[float, float, float]:
min_xyz = np.min(vertices, axis=0)
max_xyz = np.max(vertices, axis=0)
size = (max_xyz - min_xyz) / 2.0
assert np.all(size >= 0.0)
pos = min_xyz + size
return pos, size, np.linalg.norm(size)
def subdivide_mesh(
vertices: np.ndarray, faces: np.ndarray, subdivide_threshold: float
) -> np.ndarray:
"""
Subdivide mesh into smaller triangles.
:param vertices: Vertices of the mesh.
:param faces: Faces of the mesh.
:param subdivide_threshold: The max length for edges after the subdivision is
defined as norm(bounding_box_size) * subdivide_threshold
:return: Vertices after subdivision
"""
max_edge = get_vertices_bounding_box(vertices)[-1] * subdivide_threshold
return trimesh.remesh.subdivide_to_size(vertices, faces, max_edge)[0]