Releases: ipc-sim/ipc-toolkit
Releases · ipc-sim/ipc-toolkit
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_formulation
flag inCollisions
with two flags:use_area_weighting
anduse_improved_max_approximator
. - Move the physical barrier rescaling from collision weights into the
BarrierPotential
using a flaguse_physcial_barrier
.
- Replace the
- Replace scalar
tbb::enumerable_thread_specific
withtbb::parallel_reduce
by @zfergus in #121 - Fix missing
max_iterations
andtolerance
variables incompute_collision_free_stepsize
when usingSWEEP_AND_TINIEST_QUEUE
by @antoinebou12 in #123 - Add
cuda.yml
to 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.build
tutorial (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 lapack
to 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
Barrier
class to enable dynamic selection of barrier function. - Add a
NarrowPhaseCCD
class 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_*
fromCollision
andCollisions
- Add a new class hierarchy
Potential
which represents computing the sum of individual potentials per collision- Implement the barrier potential and friction dissipative potential as Potentials:
BarrierPotential
andFrictionPotential
- Implement the barrier potential and friction dissipative potential as Potentials:
- Now,
Collisions
serve 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 onlyEdgeEdgeCollision
overrides this
- The default mollifier is
- Remove versions of
compute_distance
andccd
from 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
Barrier
as an interface for generic barriers - Add
ClampedLogBarrier
class which implements the smoothly clamped log barrier functions from [Li et al. 2020] -
barrier_gradient
andbarrier_hessian
renamed tobarrier_first_derivative
andbarrier_second_derivative
respectively - Co-authored by @arvigj
- Update compiler warnings in #88
- Add
-Werror=enum-conversion
and-Wfloat-conversion
- Add
- Fix 🐛 hash when not using Abseil in #90
- Clean-up SpatialHash Broad Phase in #91
- Replace
IPC_TOOLKIT_WITH_CORRECT_CCD
withIPC_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
camelCase
withsnake_case
inSpatialHash
andHashGrid
- 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_QUEUE
toSWEEP_AND_PRUNE
to 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_GPU
toSWEEP_AND_TINIEST_QUEUE
to 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
CollisionMesh
in #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
tolerance
andmax_iterations
parameters withconst NarrowPhaseCCD& narrow_phase_ccd
parameter -
NarrowPhaseCCD
is a virtual class containing the CCD methods for point-point, point-edge, edge-edge, and point-triangle CCD -
NarrowPhaseCCD
is implemented byInexactCCD
,TightInclusionCCD
, andAdditiveCCD
classes -
[Breaking] The optional parameter order to
is_step_collision_free
andcompute_collision_free_stepsize
is 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.cmake
to now add support for Neon (Arm/Apple Silicon SIMD instruction set) in #58- Credit:
FindSIMD.cmake
from 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
dtype
to 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_distance
toCollisionConstraint::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_ccd
algorithm, utilize our distance function rather than porting the Codim-IPC versions, returntrue
if the initial distance is less than the minimum distance, and add an explicittmax
parameter 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_psd
andproject_to_pd
in #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
NonlinearTrajectory
virtual 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_linear
function 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_intersect
in #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
CollisionStencil
parent class toCandidates
,CollisionConstraints
, andFrictionConstraints
. - Renamed
Constraints
toCollisionConstraints
- Replaced single letter variable names
V
,E
,F
withvertices
/positions
,edges
,faces
- Renamed
*_index
->*_id
- Replaced
inflation_radius = min_distance / 1.99
withinflation_radius = min_distance / 2
and use rounding mode to conservativly inflate AABBs -
CollisionConstraints::use_convergent_formulation
andare_shape_derivatives_enabled
must now be accessed through getter and setter functions - Friction potentials are now functions of velocity. Previously
V0
andV1
were 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_psd
tofalse
in #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-4
in #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