Collision#

Collision detection and response

This module implements two collision handling approaches:

  1. IPC (Incremental Potential Contact): Rigorous collision handling using barrier potentials with provable non-penetration guarantees. Based on Li et al. “Incremental Potential Contact” (2020).

  2. Simplified: Fast approximate collision detection using distance-based repulsion forces for real-time simulation.

The IPC barrier function is:

\[b(d) = -(d - \hat{d})^2 \log(d/\hat{d}) \text{ for } d < \hat{d}\]

where \(d\) is the distance between primitives and \(\hat{d}\) is the activation distance. This creates smooth repulsive forces that prevent penetration.

class diffsim.collision.IPCCollisionHandler(barrier_stiffness=1000.0, dhat=0.001, friction_mu=0.3)[source]#

Bases: object

IPC (Incremental Potential Contact) collision handler

Implements collision handling using smooth barrier potentials as described in: Li, M., Ferguson, Z., Schneider, T., Langlois, T. R., Zorin, D., Panozzo, D., … & Jiang, C. (2020). Incremental potential contact: intersection-and inversion-free, large-deformation dynamics. ACM Trans. Graph., 39(4), 49.

The barrier function creates smooth repulsive forces that activate when primitives approach within a threshold distance \(\hat{d}\), preventing penetration while maintaining continuity for gradient-based optimization.

Parameters:
  • barrier_stiffness (float) – Stiffness coefficient \(\kappa\) (default: 1e3)

  • dhat (float) – Barrier activation distance \(\hat{d}\) (default: 1e-3)

  • friction_mu (float) – Friction coefficient (default: 0.3)

kappa#

Barrier stiffness

Type:

float

dhat#

Activation distance

Type:

float

dhat_squared#

Squared activation distance for efficiency

Type:

float

friction_mu#

Friction coefficient

Type:

float

__init__(barrier_stiffness=1000.0, dhat=0.001, friction_mu=0.3)[source]#

Initialize IPC collision handler

Parameters:
  • barrier_stiffness – stiffness of barrier potential

  • dhat – activation distance for barrier (collision threshold)

  • friction_mu – friction coefficient

barrier_function(d_squared)[source]#

IPC barrier function: b(d) for distance d

Parameters:

d_squared – squared distance

Returns:

barrier value

barrier_gradient(d_squared)[source]#

Gradient of barrier function

Parameters:

d_squared – squared distance

Returns:

gradient magnitude

point_triangle_distance(p, v0, v1, v2)[source]#

Compute squared distance from point p to triangle (v0, v1, v2)

Parameters:
  • p\((N, 3)\) points

  • v0\((M, 3)\) triangle vertices

  • v1\((M, 3)\) triangle vertices

  • v2\((M, 3)\) triangle vertices

Returns:

\((N, M)\) squared distances closest_points: \((N, M, 3)\) closest points on triangles

Return type:

distances

compute_self_collision_forces(mesh, positions)[source]#

Compute self-collision forces using IPC barrier potentials

This is a simplified version that checks vertex-face distances

Parameters:
  • mesh – TetrahedralMesh

  • positions\((N, 3)\) current positions

Returns:

\((N, 3)\) collision forces

Return type:

forces

class diffsim.collision.SimplifiedCollisionHandler(collision_distance=0.02, repulsion_stiffness=10000.0, max_checks_per_frame=1000)[source]#

Bases: object

Fast simplified collision detection for real-time simulation

Uses distance-based repulsion without full CCD

__init__(collision_distance=0.02, repulsion_stiffness=10000.0, max_checks_per_frame=1000)[source]#
Parameters:
  • collision_distance – minimum distance threshold

  • repulsion_stiffness – strength of repulsion forces

  • max_checks_per_frame – maximum collision checks per frame (for performance)

compute_self_collision_forces(mesh, positions)[source]#

Fast self-collision detection using simple distance checks

Parameters:
  • mesh – TetrahedralMesh

  • positions\((N, 3)\) current positions

Returns:

\((N, 3)\) repulsion forces

Return type:

forces