Hydroelastic Contact#

Tool Reference

Hydroelastic contact is a contact model in the Newton physics backend that resolves collisions over a contact area rather than at a few discrete points. Each participating surface is treated as a thin compliant layer. When two such layers overlap, Newton extracts a contact patch and distributes the normal force across it. This representation improves force and torque estimates for conforming and large-area contacts.

This page describes the contact model, the stages of the collision pipeline, and the parameters that control it. Per-shape behavior is authored in USD through NewtonSDFCollisionAPI; pipeline-wide behavior is set at runtime through HydroelasticConfig. For the Newton backend overview, see Newton Physics Backend.

Overview#

Rigid contact in most engines uses point contacts: the solver finds one or a few points where two shapes penetrate and applies forces there. This is efficient for convex shapes but degrades for several common cases:

  • Flat-on-flat contact, where the chosen points jump between steps and destabilize the pose.

  • Large contact patches, where a single point misrepresents the pressure distribution.

  • Pairs of differing material stiffness, where geometry alone does not determine the result.

Hydroelastic contact addresses these cases by modeling each surface as a compliant layer. Where two layers overlap, Newton computes a contact patch (an area) and integrates the normal force over it. Tangential friction is still applied by the solver at discrete contact points placed on the patch.

Hydroelastic contact is opt-in. Both shapes in a pair must enable it in USD, both must carry valid signed distance field (SDF) data, and the runtime pipeline must have the hydroelastic path enabled. The full set of conditions is listed in the requirements note.

When To Use Hydroelastic Contact#

Use hydroelastic contact

Use the default contact path

Grasping, pushing, and sliding manipulation

Locomotion and convex-on-convex contact

Flat or conforming contact patches

Plane and heightfield colliders

Tasks that need stable force and torque

Workloads that prioritize minimal setup and speed

Hydroelastic contact requires volumetric shapes with SDF data. It is not supported for planes, heightfields, or non-watertight meshes.

How It Works#

Signed Distance Fields#

Each participating collider stores a signed distance field \(\phi(\mathbf{x})\), which gives the distance from a point to the shape surface:

  • \(\phi > 0\) outside the solid,

  • \(\phi = 0\) on the surface,

  • \(\phi < 0\) inside the solid.

The resolution and stored band of \(\phi\) are set per shape through the USD attributes in Per-Shape Configuration (USD Attributes).

Signed distance field iso-contours, two overlapping bodies, and the interface field construction.

Signed distance field iso-contours, overlapping bodies, and interface field construction.#

Panel A shows a single shape’s signed distance field, with iso-contours that follow the surface. Panel B shows two overlapping bodies; the dashed curve is the contact patch where the interface field is zero. Panel C shows construction of the interface field \(f\), the contact interface where \(f = 0\), and the effective pair stiffness.

The Interface Field#

The contact patch must account for material stiffness, not geometry alone. The simple midsurface \(\phi_A - \phi_B = 0\) marks the points equidistant from both surfaces, so a stiff shape and a soft shape with identical geometry would produce the same patch. To avoid this, Newton defines a pressure-balance field over the overlap region (where \(\phi_A < 0\) and \(\phi_B < 0\)):

\[f = \tilde{k}_a\,\phi_A - \tilde{k}_b\,\phi_B , \qquad \tilde{k}_a = \frac{k_a}{\sqrt{k_a k_b}}, \qquad \tilde{k}_b = \frac{k_b}{\sqrt{k_a k_b}}, \qquad \tilde{k}_a\,\tilde{k}_b = 1 ,\]

where \(k_a\) and \(k_b\) are the per-shape hydroelastic stiffness values. The contact patch is the zero set \(\{f = 0\}\), which is equivalent to \(k_a\,\phi_A = k_b\,\phi_B\): the softer shape (smaller \(k\)) deforms further to balance a stiffer partner. Outside the overlap region Newton falls back to \(f = \phi_A - \phi_B\) for gap-style detection. The field \(f\) is a scalar that locates the patch surface; it is not a force or a stress.

From Patch to Contact Forces#

After the patch surface is extracted as a triangle mesh, Newton computes a contact contribution per triangle:

  1. Area \(A\) and outward unit normal \(\mathbf{n}\) from the triangle geometry.

  2. Penetration depth \(\delta\), the average of \(\phi_B\) at the three vertices (negative when penetrating).

  3. A scalar weight \(w = A\,(-\delta)\) and a force contribution \(\mathbf{F} = w\,\mathbf{n}\).

The pair stiffness passed to the solver combines the two per-shape values in series:

\[k_{\mathrm{eff}} = \frac{k_a k_b}{k_a + k_b} .\]

Per contact, the effective spring stiffness is \(c = A\,k_{\mathrm{eff}}\), and penalty solvers apply a normal force \(f_n \approx c\,d\), where \(d\) is the penetration along \(\mathbf{n}\). When contact reduction is enabled, many triangles are merged into fewer contacts and \(c\) is rescaled so the aggregate normal force is preserved.

Contact patch aggregated into per-triangle weights, written to the contact buffer, and converted into a solver normal force.

The contact patch (green) is aggregated into per-triangle weights, written to the contact buffer with stiffness \(c\), and converted by the solver into a normal force.#

Note

All solvers receive the same contact buffer: contact points, normals, and an optional per-contact stiffness \(c\). Standard shape materials (stiffness, damping, friction) still apply, and a positive per-contact \(c\) overrides the default contact stiffness.

MuJoCo uses \(c\) and converts it into the constraint solver reference and impedance. XPBD does not use \(c\); it applies position projection from geometry. The patch still improves force and torque on XPBD, but not stiffness-based compliance.

Collision Pipeline#

The hydroelastic path runs as a sequence of stages each step. Per-shape inputs come from USD; pipeline-wide options come from the runtime configuration.

Hydroelastic collision pipeline stages and where USD versus runtime configuration apply.

Pipeline stages and where USD versus runtime configuration apply.#

The pipeline comprises the following stages:

  • Broad phase — Selects candidate shape pairs where both shapes are hydroelastic.

  • Sparse SDF broad phase — Performs a bounding-box test, then lists near-surface regions on the finer shape.

  • Octree iso-refinement — Locates the regions the interface \(\{f = 0\}\) may cross.

  • Surface extraction — Builds the triangle mesh of \(\{f = 0\}\) using marching cubes.

  • Contact generation — Computes \(A\), \(\delta\), \(\mathbf{n}\), and the stiffness \(c\) per triangle.

  • Contact reduction — Optionally merges contacts while preserving the aggregate force and torque.

  • Solver — Applies the normal force and friction from the resulting contacts.

Sparse Signed Distance Fields#

A dense SDF stored at high resolution scales with the full volume of a shape’s bounding box. Most of that volume carries no useful contact information, because interaction happens only near surfaces. Newton therefore stores the field sparsely: high resolution is retained in a narrow band around the surface, while the interior and surrounding empty space are stored coarsely. Memory then scales with surface area rather than volume, while distances and gradients remain accurate where contacts form. The band depth and field resolution are set per shape in USD.

When a hydroelastic pair passes the broad phase, a bounding-box test first determines whether the two fields can overlap; pairs that cannot are discarded. For the remaining pairs, the finer shape is searched against the other, and its near-surface regions become the candidate set for refinement. This stage is intentionally coarse: it establishes only that the bodies may touch and which regions warrant closer examination.

Octree Iso-Refinement#

The contact patch is a thin surface, so only a small fraction of the candidate regions lies close enough to matter. Newton narrows the search hierarchically. Each candidate region is subdivided repeatedly, and at every level a conservative test discards any sub-region that cannot contain the interface: if the interface value at the center is too large relative to the sub-region size, the surface cannot cross it. Sub-regions far outside the stored narrow band of either shape are skipped as well. Subdivision continues until the surviving regions are small enough to feed surface extraction. This refinement is the main runtime acceleration of the hydroelastic path. It has no dedicated tuning parameters; its behavior follows from the per-shape field resolution and narrow-band settings in USD.

Surface Extraction and Contact Reduction#

Marching cubes converts the sampled scalar field into a triangle mesh of the isosurface \(\{f = 0\}\). Newton runs it only on the locations kept by refinement, so the cost scales with the size of the patch rather than the volume of the shapes. For each triangle, the pipeline records the outward normal and centroid (the contact point), the penetration depth from \(\phi_B\), and the area, scaled down when only part of the triangle lies inside the overlap.

When two surfaces nearly coincide, edge crossings can produce degenerate, near-zero-area triangles. Newton clamps these crossings slightly toward the interior to keep triangles well formed. The clamp is controlled by mc_edge_clamp_min and can be reduced toward zero for high-fidelity cases such as threaded fasteners.

Surface extraction can produce many small contacts across one patch. Contact reduction is an optional stage that replaces them with a smaller representative set while keeping the aggregate force and torque close to the full patch. Nearby contributions are grouped, a representative position, normal, and depth are computed per group, and the stiffness is rescaled so the total normal-force response is preserved. Reduction is controlled entirely by the runtime configuration and has no per-shape USD attributes.

Per-Shape Configuration (USD Attributes)#

Per-shape behavior is authored by applying NewtonSDFCollisionAPI to a collision shape prim. Applying this schema enables SDF generation for the shape and inherits NewtonCollisionAPI and PhysicsCollisionAPI.

Hydroelastic Attributes#

USD attribute

Type

Default

Description

newton:hydroelasticEnabled

bool

false

Opt-in for this shape. Both shapes in a pair must be true for hydroelastic contacts to be generated.

newton:hydroelasticStiffness

float

1e10

Per-shape stiffness \(k\) in N/m³. Higher values produce stiffer contacts; lower values produce softer contacts. Consulted only when newton:hydroelasticEnabled is true. It does not enable hydroelastic contact on its own.

SDF Grid Attributes#

These attributes control how the signed distance field is generated and stored. An SDF is required for hydroelastic contact.

USD attribute

Type

Default

Description

newton:sdfMaxResolution

int

64

Maximum grid dimension along the longest axis. Must be divisible by 8. Higher values capture finer surface detail at higher memory cost.

newton:sdfTargetVoxelSize

float

unset

Target voxel size in meters. When set to a positive value, it takes precedence over newton:sdfMaxResolution.

newton:sdfNarrowBandInner

float

-0.1

Inner extent of the stored narrow band in meters, measured inside the surface (negative).

newton:sdfNarrowBandOuter

float

0.1

Outer extent of the stored narrow band in meters, measured outside the surface (positive).

newton:sdfPadding

float

engine default

Extra padding in meters added to the SDF bounding box, extending the region where distance queries are valid.

newton:sdfTextureFormat

token

uint16

Storage precision for SDF voxels: uint8 (least memory), uint16, or float32 (full precision).

Contact Offset Attributes#

These attributes are provided by the base NewtonCollisionAPI and apply to the shape’s collision surface.

USD attribute

Type

Default

Description

newton:contactMargin

float

0

Outward inflation of the collision surface in meters. Margins of the two shapes are summed at contact. Useful for thin shells and cloth. Comparable to the PhysX rest offset.

newton:contactGap

float

engine default

Additional separation in meters at which contacts are added to the solver. Larger values detect contacts earlier and help avoid tunneling. Comparable to the PhysX contact offset minus rest offset.

Runtime Configuration#

Pipeline-wide behavior is set through HydroelasticConfig, nested in CollisionConfig on NewtonConfig. This configuration is not stored in USD. Apply it with configure_newton() after loading the stage and before starting the simulation.

# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

"""Apply HydroelasticConfig through configure_newton before simulation starts."""

import omni.kit.app

ext_mgr = omni.kit.app.get_app().get_extension_manager()
ext_mgr.set_extension_enabled_immediate("isaacsim.physics.newton", True)

from isaacsim.physics.newton import CollisionConfig, HydroelasticConfig, NewtonConfig, configure_newton

configure_newton(
    NewtonConfig(
        collision_cfg=CollisionConfig(
            hydroelastic=HydroelasticConfig(
                enabled=True,
                reduce_contacts=True,
            ),
        ),
    )
)

The main runtime switches are enabled (run the hydroelastic path when hydroelastic shapes are present) and reduce_contacts (merge patch triangles into fewer solver contacts). Rerun the configuration after opening or reloading a stage. Defaults and the remaining fields on HydroelasticConfig and CollisionConfig are listed in the isaacsim.physics.newton Python API.

Note

Hydroelastic contact is generated for a pair only when all of the following hold:

  1. HydroelasticConfig.enabled is True in the runtime configuration.

  2. Both shapes set newton:hydroelasticEnabled = true in USD.

  3. Both shapes carry valid SDF data (NewtonSDFCollisionAPI applied).

  4. Both shapes are volumetric, not planes or heightfields.

Additional Resources#