Releases: ipc-sim/ipc-toolkit
Releases · ipc-sim/ipc-toolkit
v1.4.0
Highlights
- Add adhesion potentials for sticky interactions, allowing for more realistic simulations of contact between objects.
- Based on the paper "Augmented Incremental Potential Contact for Sticky Interactions" by Fang et al. [2023]
- Implement new barrier functions from the literature.
NormalizedClampedLogBarrier: unit-less clamped log barrier function.ClampedLogSqBarrier: clamped log barrier with a quadratic log term from [Huang et al. 2024]CubicBarrier: cubic barrier function from [Ando 2024]
- Add support for separate static and kinetic coefficients in tangential collisions.
What's Changed
- Adhesion by @zfergus in #85
- Implement the adhesion potentials from "Augmented Incremental Potential Contact for Sticky Interactions" [Fang et al. 2023]
- Files moved from
ipc/frictionto genericipc/tangentialandipc/collisions/tangentialfolders. - Renamed
Collisionclasses toNormalCollision - Renamed
FrictionCollisionclasses toTangentialCollision - Renamed
DistanceBasedPotentialtoNormalPotential- Added
force_magnitudeandforce_magnitude_gradientmethods toNormalPotential
- Added
- Added
TangentialPotentialparent class toFrictionPotentialandTangentialAdhesionPotential - Tutorial added by @antoinebou12 in #144
- Use normal potential in tangential collisions by @maxpaik16 in #142
- Replaces the
const BarrierPotential¶meter with aconst NormalPotential& - This allows tangential adhesion to be properly set up in simulation.
- Replaces the
- Add
NormalizedClampedLogBarrierby @zfergus in #143 - Add max_iterations parameter to Additive CCD by @zfergus in #145
- Add cubic barrier with elasticity-inclusive dynamic stiffness by @zfergus in #148
- Implement the cubic barrier and elasticity-inclusive dynamic stiffness from [Ando 2024]
- Implement
$log^2$ -barrier from GIPC [Huang et al. 2024] - Add
compute_coefficients()toCollisionStencil– computes the coefficients$\vec{c}$ s.t.$d(x) = \Vert \sum c_i x_i\Vert^2$ - Add
compute_distance()toCollisionStenciltaking$V$ ,$E$ ,$F$ directly
- Replace
BroadPhaseMethodenum withshared_ptr<BroadPhase>by @zfergus in #152 - Remove
ContinuousCollisionCandidateinheritance by @zfergus in #156- Replace it with the
CollisionStencilclass.
- Replace it with the
- Replace
const Eigen::Matrix&withEigen::ConstRef<Matrix>by @zfergus in #157- This allows for more efficient passing of matrices to functions.
- Separate Static and Kinetic Coefficients of Friction by @zfergus in #177
- Enhancements to tangential collision handling by distinguishing between static and kinetic friction coefficients (
mu_sandmu_k) and implementing smooth transitions between them. - Updated
TangentialCollisionclass to replacemuwith separatemu_s(static friction coefficient) andmu_k(kinetic friction coefficient). This change applies to the class definition and all related methods. -
New
smooth_mufunctions: Added functions to compute smooth transitions between static and kinetic friction coefficients, including derivatives and related mathematical formulations. These functions improve the modeling of friction forces at varying tangential velocities. - Integration with adhesion module: Incorporated smooth friction coefficient calculations into the adhesion module.
- Tutorial added by @zfergus in #178
- Enhancements to tangential collision handling by distinguishing between static and kinetic friction coefficients (
Python Specific
- Add faster
can_collidefunctions to Python by @zfergus in #135 - Add
PyBroadPhaseandPyNarrowPhaseCCDclasses to wrap theBroadPhaseandNarrowPhaseCCDclasses, respectively, allowing for custom implementations of these classes in Python. - Add new constructors to candidate classes (
EdgeEdgeCandidate,EdgeFaceCandidate,EdgeVertexCandidate,FaceFaceCandidate,FaceVertexCandidate,VertexVertexCandidate) that accept tuples for easier initialization. - Include a call to
std::atexitto reset the thread limiter upon program exit to ensure proper cleanup. ⚠️ PythonNarrowPhaseCCDimplementations will not work with multi-threading because of GIL locking.- Switch from
py::argto_aliterals by @zfergus in #168
Miscellaneous
- Add
/Walland/MPcompiler flags for MSVC by @zfergus in #134 - Enable CUDA by default if CUDA is detected by CMake by @zfergus in #134
- Devcontainer by @antoinebou12 in #136
- Update dependencies for CMake 4.0 by @zfergus in #158
- Organize folder structure for generated Xcode project by @zfergus in #159
- Refactor CMake configurations and improve project structure
- Updated CMake recipes for third-party libraries to set appropriate folder properties for IDE organization.
- Changed the CPMAddPackage references for scalable-ccd to a more recent commit.
- Enhanced logging functionality by adding a new
log_and_throw_errorfunction to improve error handling. - Improved documentation in the style guide for naming conventions.
- Move generated
config.hppfile fromsrc/ipctobuild/include/src/ipc - Update CUDA builds in
CMakePresets.json - Remove
virtualtag fromBroadPhase::detect_collision_candidates
- Index typedef by @zfergus in #161
- Add a
index_ttypedef for vertex/edge/face ids. Changes default fromlongtoint32_t.
- Add a
- Update Tight Inclusion package version to 1.0.6 by @zfergus in #165
- Fix cmake for non-top-level inclusion by @sin3point14 in #167
- Improve and clean up documentation:
New Contributors
- @maxpaik16 made their first contribution in #142
- @sin3point14 made their first contribution in #167
Full Changelog: v1.3.1...v1.4.0
v1.3.1
What's Changed
- Move test data to an external repository by @zfergus in #113
- Download test data at compile time as needed using CMake
- Bump actions/download-artifact from 3 to 4.1.7 in /.github/workflows by @dependabot in #119
- Individual convergent formulation flags by @zfergus in #120
- Replace the
use_convergent_formulationflag inCollisionswith two flags:use_area_weightinganduse_improved_max_approximator. - Move the physical barrier rescaling from collision weights into the
BarrierPotentialusing a flaguse_physcial_barrier.
- Replace the
- Replace scalar
tbb::enumerable_thread_specificwithtbb::parallel_reduceby @zfergus in #121 - Fix missing
max_iterationsandtolerancevariables incompute_collision_free_stepsizewhen usingSWEEP_AND_TINIEST_QUEUEby @antoinebou12 in #123 - Add
cuda.ymlto test if the code compile with CUDA enabled by @zfergus in #125 - Update filib to allow shared library build by @zfergus in #122
- Fix
friction_collisions.buildtutorial (Issue #126) by @zfergus in #127 - Sort includes using clang-format by @zfergus in #129
- Add frequently asked questions page to the tutorial documentation
- Fix barrier API documentation
- On Apple, link Eigen against Accelerate as a BLAS/LAPACK backend
- Requires
brew install lapackto install LAPACKE headers
- Requires
New Contributors
- @dependabot made their first contribution in #119
- @antoinebou12 made their first contribution in #123
Full Changelog: v1.3.0...v1.3.1
v1.3.0
Highlights
- Separated the collision set and potential computations. This allows us to more easily add new potentials in the future. This will require updating calls to
compute_potential_*. See the tutorial for details. - Add a
Barrierclass to enable dynamic selection of barrier function. - Add a
NarrowPhaseCCDclass to enable dynamic selection of narrow-phase CCD method.
What's Changed
- Refactor potentials by @zfergus in #83
- Replace "constraint" and "contact" names with "collision"
- Removed
compute_potential_*fromCollisionandCollisions - Add a new class hierarchy
Potentialwhich represents computing the sum of individual potentials per collision- Implement the barrier potential and friction dissipative potential as Potentials:
BarrierPotentialandFrictionPotential
- Implement the barrier potential and friction dissipative potential as Potentials:
- Now,
Collisionsserve solely as the set of active collisions - Add the distance mollifier to all collisions with a
is_mollified()function- The default mollifier is
$m(x) = 1$ , and onlyEdgeEdgeCollisionoverrides this
- The default mollifier is
- Remove versions of
compute_distanceandccdfrom CollisionStencil which take the full mesh as input- Instead, expose the versions that take the collision stencil's vertex positions directly
- Polymorphic barrier in #84
- Make the barrier function an object so it can be changed at runtime
- Add a virtual class
Barrieras an interface for generic barriers - Add
ClampedLogBarrierclass which implements the smoothly clamped log barrier functions from [Li et al. 2020] -
barrier_gradientandbarrier_hessianrenamed tobarrier_first_derivativeandbarrier_second_derivativerespectively - Co-authored by @arvigj
- Update compiler warnings in #88
- Add
-Werror=enum-conversionand-Wfloat-conversion
- Add
- Fix 🐛 hash when not using Abseil in #90
- Clean-up SpatialHash Broad Phase in #91
- Replace
IPC_TOOLKIT_WITH_CORRECT_CCDwithIPC_TOOLKIT_WITH_INEXACT_CCD- Always include Tight Inclusion CCD because it is used by Nonlinear CCD
- Add support for face-face collision (not used anywhere but for completeness and future-proof nonlinear face-face)
- Add and use generic functions to
SpatialHash - Replace
camelCasewithsnake_caseinSpatialHashandHashGrid
- Replace
- Update Scalable CCD in #92
- Updated Scalable CCD (i.e., Sweep and Tiniest Queue and CUDA Tight Inclusion CCD) to the unified repository with support for generic collision pairs.
- Renamed
SWEEP_AND_TINIEST_QUEUEtoSWEEP_AND_PRUNEto reflect that it is a standard implementation of the sweep and prune algorithm (see, e.g., "Real-Time Collision Detection" [Ericson 2004]) - Renamed
SWEEP_AND_TINIEST_QUEUE_GPUtoSWEEP_AND_TINIEST_QUEUEto reflect that it is the only existing implementation of the sweep and tiniest queue algorithm
- Mark single argument constructors explicit in #93
- Mark
BarrierPotential(double)andFrictionPotential(double)as explicit constructors to avoid implicit conversions from double
- Mark
- Fix compatibility with the latest Eigen by @teseoch in #94
- Add clang-format check action in #96
- Add new project PSD option by @Huangzizhou in #95
- Instead of clamping the negative eigenvalues to zero, add the option to flips the sign of negative eigenvalues according to [Chen et al. 2024]
- Fix 🐛 Python bindings for Numpy 2 in #100
- Make faces an optional parameter to
CollisionMeshin #105 - Fix Python documentation by @rc in #108
- Polymorphic CCD in #110
- Add narrow phase CCD parent class; pass CCD object to choose method
- Replace
toleranceandmax_iterationsparameters withconst NarrowPhaseCCD& narrow_phase_ccdparameter -
NarrowPhaseCCDis a virtual class containing the CCD methods for point-point, point-edge, edge-edge, and point-triangle CCD -
NarrowPhaseCCDis implemented byInexactCCD,TightInclusionCCD, andAdditiveCCDclasses -
[Breaking] The optional parameter order to
is_step_collision_freeandcompute_collision_free_stepsizeis changed fromtoconst BroadPhaseMethod broad_phase_method = DEFAULT_BROAD_PHASE_METHOD, const double min_distance = 0.0, const double tolerance = DEFAULT_CCD_TOLERANCE, const long max_iterations = DEFAULT_CCD_MAX_ITERATIONS);
const double min_distance = 0.0, const BroadPhaseMethod broad_phase_method = DEFAULT_BROAD_PHASE_METHOD, const NarrowPhaseCCD& narrow_phase_ccd = DEFAULT_NARROW_PHASE_CCD);
- The inexact floating-point CCD can be enabled beside the Tight Inclusion CCD rather than replacing it
New Contributors
- @Huangzizhou made their first contribution in #95
- @rc made their first contribution in #108
Full Changelog: v1.2.1...v1.3.0
v1.2.1
v1.2.0
Various new features 🚀 and some bug fixes 🐛.
Highlights
- Implement the improved max approximator as described in [Li et al. 2023]
- Add a port of the Additive CCD method from [Li et al. 2021]
- Add a generic implementation of the nonlinear CCD (of linear geometry) algorithm from [Ferguson et al. 2021]
- Add missing codimensional collision support (point-point and point-edge)
What's Changed
- Update website URL to ipctk.xyz in #54
- Simplify tangential basis Jacobian calculation thanks to @halehOssadat and @jpanetta in #56
- Update
FindSIMD.cmaketo now add support for Neon (Arm/Apple Silicon SIMD instruction set) in #58- Credit:
FindSIMD.cmakefrom Project CHRONO under BSD 3-Clause "New" or "Revised" License.
- Credit:
- Improve the max approximator used (i.e., sum over constraints) as described in [Li et al. 2023] in #55
- Add a
dtypeto EE collisions to keep track of the distance type for mollified constraints - Initialize mesh adjacencies by default
- Use edge length as the area weighting for codimensional edges
- Add a
- Improve documentation and tutorials in #61
- Add documentation describing the convergent formulation
- Add documentation describing the constraint offset/minimum distance
- Add documentation for broad- and narrow-phase CCD
- Add documentation for High-Order IPC
- Also, renames
CollisionConstraint::minimum_distancetoCollisionConstraint::dmin
- Add a port of the Additive CCD method from [Li et al. 2021] in #62
- This is a modified version of the original open-source implementation which is under the Appache-2.0 License.
- Modifications: remove broad phase functions, refactor code to use a single implementation of the
additive_ccdalgorithm, utilize our distance function rather than porting the Codim-IPC versions, returntrueif the initial distance is less than the minimum distance, and add an explicittmaxparameter rather than relying on the initial value oftoi. - This is mostly for reference comparison and it is not integrated into the full code. This also includes the ability to pull the sample CCD queries and run them in a unit-test (requires GMP).
- This adds missing feature mentioned in #63
- Add Codecov to get a report of unit test code coverage in #64
- Add more tests to improve code coverage and fix small bugs in #65
- Fix the symmetric matrix assertion in
project_to_psdandproject_to_pdin #67 - Handle codim. point-point collisions in #66
- This adds missing feature as discussed in #63
- Add tests of Python bindings using nose2 in #69
- In CCD, check the initial distance when no motion occurs in #71
- Add a generic implementation of the nonlinear CCD (of linear geometry) algorithm from [Ferguson et al. 2021] in #72
- Generic nonlinear trajectories are specified through a
NonlinearTrajectoryvirtual class. By default the maximum distance between the trajectory and a linearized version is computed using interval arithmetic. That is$\max_{t \in [0, 1]} \Vert p(\mathrm{lerp}(t_0, t_1, t)) - \mathrm{lerp}(p(t_0), p(t_1), t) \Vert_2 \leq \sup(\Vert p([t_0, t_1]) - \mathrm{lerp}(p(t_0), p(t_1), [0, 1]) \Vert_2)$ where$p$ is the point's position over time,$\mathrm{lerp}(a, b, t) := (b - a) t + a$ and$\sup([a,b]):=b$ . Because this can be an overly conservative approximation, users can override theNonlinearTrajectory::max_distance_from_linearfunction to compute the max directly in closed form, if known. - We perform interval arithmetic using filib which has been shown to be "the only library that is correct, consistent, portable, and efficient" [Tang et al. 2022].
- Add a nonlinear CCD tutorial to the docs in #78
- Generic nonlinear trajectories are specified through a
- Add additional compiler warnings and resolve them to be warning-free in #73
- Add Python bindings for
igl::predicate::segment_segment_intersectin #74 - Integrate SimpleBVH as a broad-phase method in #75
- Fix the shape derivative of mollified edge-edge contact in #76
- Additionally, this makes the shape derivative computation object-oriented.
- Update Python bindings with recent changes and unified comments in #77
- Add support for collision between codimensional edges and points in 3D in #79
- Implements missing features discussed in #63.
Full Changelog: v1.1.1...v1.2.0
New Contributors
- @halehOssadat made their first contribution in #56
- @jpanetta made their first contribution in #56
v1.1.1
v1.1.0
Large refactoring to make the code more object-oriented rather than passing objects to functions. Other changes include the friction potential now being a function of velocity, bug fixes, and a new tutorial.
What's Changed
- Large Refactor in #25
-
construct_collision_candidates(..., candidates)->candidates.build(...) -
is_step_collision_free(candidates, ...)->candidates.is_step_collision_free(...) -
compute_collision_free_stepsize(candidates, ...)->candidates.compute_collision_free_stepsize(...) -
compute_barrier_potential*(constraints, ...)->constraints.compute_potential*(...) -
compute_shape_derivative(constraints, ...)->constraints.compute_shape_derivative(...) -
compute_minimum_distance(constraints, ...)->constraints.compute_minimum_distance(...) -
construct_friction_constraint_set(..., friction_constraints)->friction_constraints.build(...) -
compute_friction_*(..., friction_constraints, ...)->friction_constraints.compute_*(...) - Generic
CollisionStencilparent class toCandidates,CollisionConstraints, andFrictionConstraints. - Renamed
ConstraintstoCollisionConstraints - Replaced single letter variable names
V,E,Fwithvertices/positions,edges,faces - Renamed
*_index->*_id - Replaced
inflation_radius = min_distance / 1.99withinflation_radius = min_distance / 2and use rounding mode to conservativly inflate AABBs -
CollisionConstraints::use_convergent_formulationandare_shape_derivatives_enabledmust now be accessed through getter and setter functions - Friction potentials are now functions of velocity. Previously
V0andV1were passed andU = V1-V0. This limited the integration scheme to implicit Euler. Upstream this means you need to multiply the potential by1/(dv/dx)to get the correct friction force.- Change input
$\epsilon_vh$ to$\epsilon_v$ in #37 to reflect the fact that friction is defined in terms of velocity instead of displacement now.
- Change input
-
- Changed default
project_hessian_to_psdtofalsein #30 - Update website with a tutorial (#31) and version dropdown list (#34)
- Switch from templates to using Eigen::Ref in #28
- Speed up the CCD by limiting the maximum minimum distance to
1e-4in #43 - Fix the bug pointed out in #41 in #42. Namely, to get units of distance in the barrier we should divide the original function by
$\hat{d}\cdot(\hat{d} + 2d_\min)^2$ when using distance squared. Before it was being divided by$2d_\min \hat{d} + \hat{d}^2$ . - Fix build for IPC_TOOLKIT_WITH_CORRECT_CCD=OFF in #44
- Switched from FetchContent to CPM in #48. This provides better caching between builds. Additionally, made robin-map and Abseil optional dependencies.
- Add the CFL-Inspired Culling of CCD as described in Section 3 of the Technical Supplement to IPC in #50
Full Changelog: v1.0.0...v1.1.0
v1.0.0
This is the first official release. 🎉
This is a stable release of the toolkit prior to refactoring the code and making updates to the API.
New Contributors
- @danielepanozzo made their first contribution in #20
- @arvigj made their first contribution in #22
Full Changelog: https://github.com/ipc-sim/ipc-toolkit/commits/v1.0.0