newton.geometry.NarrowPhase#

class newton.geometry.NarrowPhase(*, max_candidate_pairs, max_triangle_pairs=1000000, reduce_contacts=True, device=None, shape_aabb_lower=None, shape_aabb_upper=None, shape_voxel_resolution=None, contact_writer_warp_func=None, hydroelastic_sdf=None, has_meshes=True, has_heightfields=False)[source]#

Bases: object

__init__(*, max_candidate_pairs, max_triangle_pairs=1000000, reduce_contacts=True, device=None, shape_aabb_lower=None, shape_aabb_upper=None, shape_voxel_resolution=None, contact_writer_warp_func=None, hydroelastic_sdf=None, has_meshes=True, has_heightfields=False)#

Initialize NarrowPhase with pre-allocated buffers.

Parameters:
  • max_candidate_pairs (int) – Maximum number of candidate pairs from broad phase

  • max_triangle_pairs (int) – Maximum number of mesh triangle pairs (conservative estimate)

  • reduce_contacts (bool) – Whether to reduce contacts for mesh-mesh and mesh-plane collisions. When True, uses shared memory contact reduction to select representative contacts. This improves performance and stability for meshes with many vertices. Defaults to True.

  • device (Devicelike | None) – Device to allocate buffers on

  • shape_aabb_lower (wp.array(dtype=wp.vec3) | None) – Optional external AABB lower bounds array (if provided, AABBs won’t be computed internally)

  • shape_aabb_upper (wp.array(dtype=wp.vec3) | None) – Optional external AABB upper bounds array (if provided, AABBs won’t be computed internally)

  • shape_voxel_resolution (wp.array(dtype=wp.vec3i) | None) – Optional per-shape voxel resolution array used for mesh/SDF and hydroelastic contact processing.

  • contact_writer_warp_func (Any | None) – Optional custom contact writer function (first arg: ContactData, second arg: custom struct type)

  • hydroelastic_sdf (HydroelasticSDF | None) – Optional SDF hydroelastic instance. Set is_hydroelastic=True on shapes to enable hydroelastic collisions.

  • has_meshes (bool) – Whether the scene contains any mesh shapes (GeoType.MESH). When False, mesh-related kernel launches are skipped, improving performance for scenes with only primitive shapes. Defaults to True for safety. Set to False when constructing from a model with no meshes.

  • has_heightfields (bool) – Whether the scene contains any heightfield shapes (GeoType.HFIELD). When True, heightfield collision buffers and kernels are allocated. Defaults to False.

launch(*, candidate_pair, candidate_pair_count, shape_types, shape_data, shape_transform, shape_source, sdf_data=None, shape_sdf_index=None, shape_gap, shape_collision_radius, shape_flags, shape_collision_aabb_lower=None, shape_collision_aabb_upper=None, shape_voxel_resolution, contact_pair, contact_position, contact_normal, contact_penetration, contact_count, contact_tangent=None, device=None, **kwargs)#

Launch narrow phase collision detection on candidate pairs from broad phase.

Parameters:
  • candidate_pair (wp.array(dtype=wp.vec2i, ndim=1)) – Array of potentially colliding shape pairs from broad phase

  • candidate_pair_count (wp.array(dtype=wp.int32, ndim=1)) – Single-element array containing the number of candidate pairs

  • shape_types (wp.array(dtype=wp.int32, ndim=1)) – Array of geometry types for all shapes

  • shape_data (wp.array(dtype=wp.vec4, ndim=1)) – Array of vec4 containing scale (xyz) and thickness (w) for each shape

  • shape_transform (wp.array(dtype=wp.transform, ndim=1)) – Array of world-space transforms for each shape

  • shape_source (wp.array(dtype=wp.uint64, ndim=1)) – Array of source pointers (mesh IDs, etc.) for each shape

  • sdf_data (wp.array(dtype=SDFData, ndim=1) | None) – Compact array of SDFData structs

  • shape_sdf_index (wp.array(dtype=wp.int32, ndim=1) | None) – Per-shape SDF table index (-1 for shapes without SDF)

  • shape_gap (wp.array(dtype=wp.float32, ndim=1)) – Array of per-shape contact gaps (detection threshold) for each shape

  • shape_collision_radius (wp.array(dtype=wp.float32, ndim=1)) – Array of collision radii for each shape (for AABB fallback for planes/meshes)

  • shape_collision_aabb_lower (wp.array(dtype=wp.vec3, ndim=1) | None) – Local-space AABB lower bounds for each shape (for voxel binning)

  • shape_collision_aabb_upper (wp.array(dtype=wp.vec3, ndim=1) | None) – Local-space AABB upper bounds for each shape (for voxel binning)

  • shape_voxel_resolution (wp.array(dtype=wp.vec3i, ndim=1)) – Voxel grid resolution for each shape (for voxel binning)

  • contact_pair (wp.array(dtype=wp.vec2i)) – Output array for contact shape pairs

  • contact_position (wp.array(dtype=wp.vec3)) – Output array for contact positions (center point)

  • contact_normal (wp.array(dtype=wp.vec3)) – Output array for contact normals

  • contact_penetration (wp.array(dtype=float)) – Output array for penetration depths

  • contact_tangent (wp.array(dtype=wp.vec3) | None) – Output array for contact tangents, or None to disable tangent computation

  • contact_count (wp.array(dtype=int)) – Output array (single element) for contact count

  • device – Device to launch on

launch_custom_write(*, candidate_pair, candidate_pair_count, shape_types, shape_data, shape_transform, shape_source, sdf_data, shape_sdf_index, shape_gap, shape_collision_radius, shape_flags, shape_collision_aabb_lower, shape_collision_aabb_upper, shape_voxel_resolution, shape_heightfield_data=None, heightfield_elevation_data=None, writer_data, device=None)#

Launch narrow phase collision detection with a custom contact writer struct.

Parameters:
  • candidate_pair (wp.array(dtype=wp.vec2i, ndim=1)) – Array of potentially colliding shape pairs from broad phase

  • candidate_pair_count (wp.array(dtype=wp.int32, ndim=1)) – Single-element array containing the number of candidate pairs

  • shape_types (wp.array(dtype=wp.int32, ndim=1)) – Array of geometry types for all shapes

  • shape_data (wp.array(dtype=wp.vec4, ndim=1)) – Array of vec4 containing scale (xyz) and thickness (w) for each shape

  • shape_transform (wp.array(dtype=wp.transform, ndim=1)) – Array of world-space transforms for each shape

  • shape_source (wp.array(dtype=wp.uint64, ndim=1)) – Array of source pointers (mesh IDs, etc.) for each shape

  • sdf_data (wp.array(dtype=SDFData, ndim=1)) – Compact array of SDFData structs

  • shape_sdf_index (wp.array(dtype=wp.int32, ndim=1)) – Per-shape SDF table index (-1 for shapes without SDF)

  • shape_gap (wp.array(dtype=wp.float32, ndim=1)) – Array of per-shape contact gaps (detection threshold) for each shape

  • shape_collision_radius (wp.array(dtype=wp.float32, ndim=1)) – Array of collision radii for each shape (for AABB fallback for planes/meshes)

  • shape_flags (wp.array(dtype=wp.int32, ndim=1)) – Array of shape flags for each shape (includes ShapeFlags.HYDROELASTIC)

  • shape_collision_aabb_lower (wp.array(dtype=wp.vec3, ndim=1)) – Local-space AABB lower bounds for each shape (for voxel binning)

  • shape_collision_aabb_upper (wp.array(dtype=wp.vec3, ndim=1)) – Local-space AABB upper bounds for each shape (for voxel binning)

  • shape_voxel_resolution (wp.array(dtype=wp.vec3i, ndim=1)) – Voxel grid resolution for each shape (for voxel binning)

  • writer_data (Any) – Custom struct instance for contact writing (type must match the custom writer function)

  • device – Device to launch on