Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Haosulab ManiSkill TrimeshUtils

From Leeroopedia
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 a PhysxRigidBaseComponent as 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 a RenderBodyComponent.
  • 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

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)}")

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment