Implementation:Haosulab ManiSkill TrimeshUtils
| Knowledge Sources | |
|---|---|
| Domains | Robotics, Simulation, Mesh Processing |
| Last Updated | 2026-02-15 08:00 GMT |
Overview
Concrete tool for extracting and merging collision and visual meshes from SAPIEN physics and render components as trimesh objects.
Description
The trimesh_utils.py module provides utilities for converting SAPIEN collision shapes and render shapes into trimesh.Trimesh objects, enabling mesh-based analysis, visualization, and computation.
Collision mesh extraction:
get_component_meshes(component)-- Extracts all collision shapes from aPhysxRigidBaseComponentas trimesh objects in the component's local frame. Handles box, capsule, cylinder, sphere, convex mesh, and triangle mesh shapes. Planes are skipped.get_component_mesh(component, to_world_frame)-- Merges all collision meshes of a component into one, optionally transforming to world frame.
Visual mesh extraction:
get_render_body_meshes(visual_body)-- Extracts all render shapes from aRenderBodyComponent.get_render_shape_meshes(render_shape)-- Converts individual render shapes (box, capsule, cylinder, sphere, triangle mesh) to trimesh. For triangle meshes, handles multi-part shapes with scaling.get_actor_visual_meshes(actor)-- Gets all visual meshes for a SAPIEN entity.get_actor_visual_mesh(actor)-- Merged visual mesh for an entity.
Mesh merging:
merge_meshes(meshes)-- Combines a list of trimesh objects into a single mesh by concatenating vertices and offsetting face indices.
Usage
Used by Actor, Link, and Articulation structs for collision/visual mesh access. Also used in geometry utilities for bounding volume computation and by visualization tools.
Code Reference
Source Location
- Repository: Haosulab_ManiSkill
- File: mani_skill/utils/geometry/trimesh_utils.py
Signature
def get_component_meshes(component: physx.PhysxRigidBaseComponent) -> list[trimesh.Trimesh]: ...
def get_render_body_meshes(visual_body: sapien.render.RenderBodyComponent) -> list[trimesh.Trimesh]: ...
def get_render_shape_meshes(render_shape: sapien.render.RenderShape) -> list[trimesh.Trimesh]: ...
def get_actor_visual_meshes(actor: sapien.Entity) -> list[trimesh.Trimesh]: ...
def merge_meshes(meshes: list[trimesh.Trimesh]) -> trimesh.Trimesh: ...
def get_component_mesh(component, to_world_frame=True) -> trimesh.Trimesh: ...
def get_actor_visual_mesh(actor: sapien.Entity) -> trimesh.Trimesh: ...
Import
from mani_skill.utils.geometry.trimesh_utils import (
get_component_meshes,
merge_meshes,
get_actor_visual_meshes,
)
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| component | PhysxRigidBaseComponent | Yes | Physics component with collision shapes |
| visual_body | RenderBodyComponent | Yes | Render component with visual shapes |
| actor | sapien.Entity | Yes | SAPIEN entity to extract meshes from |
Outputs
| Name | Type | Description |
|---|---|---|
| meshes | list[trimesh.Trimesh] | List of extracted mesh objects |
| mesh | trimesh.Trimesh | Single merged mesh (or None if empty) |
Usage Examples
Basic Usage
from mani_skill.utils.geometry.trimesh_utils import get_component_meshes, merge_meshes
# Get collision meshes for a physics component
meshes = get_component_meshes(actor_component)
merged = merge_meshes(meshes)
print(f"Total vertices: {len(merged.vertices)}")