in robogym/envs/rearrange/common/utils.py [0:0]
def get_all_vertices(sim, object_name, subdivide_threshold=None) -> np.ndarray:
"""
Return all vertices for given object.
:param sim: The MjSim instance.
:param object_name: The object name.
:param subdivide_threshold: If provided, subdivide mesh into smaller faces.
See subdivide_mesh for detail of this parameter.
:return: Array of all vertices for this object.
"""
all_verts: List[np.ndarray] = []
all_faces: List[Optional[np.ndarray]] = []
object_rot_mat = quat2mat(
quat_conjugate(mat2quat(sim.data.get_body_xmat(object_name)))
)
geom_ids = geom_ids_of_body(sim, object_name)
for geom_id in geom_ids:
pos = sim.model.geom_pos[geom_id]
quat = quat_conjugate(sim.model.geom_quat[geom_id])
mat = quat2mat(quat)
# Get all vertices associated with the current geom.
verts = get_geom_vertices(sim, geom_id)
faces = get_geom_faces(sim, geom_id)
# Translate from geom's to body's coordinate frame.
geom_ref_verts = verts @ mat
geom_ref_verts = pos + geom_ref_verts
all_verts.append(geom_ref_verts)
all_faces.append(faces)
if subdivide_threshold is not None and all(f is not None for f in all_faces):
# We can only subdivide mesh with faces.
mesh = trimesh.util.concatenate(
[
trimesh.Trimesh(vertices=verts, faces=faces)
for verts, faces in zip(all_verts, all_faces)
]
)
verts = subdivide_mesh(mesh.vertices, mesh.faces, subdivide_threshold)
else:
verts = np.concatenate(all_verts, axis=0)
return verts @ object_rot_mat