Barrier

Barrier functions and functionals.

Types

Name

Description

Barrier

Base class for barrier functions.

ClampedLogBarrier

Smoothly clamped log barrier functions from [Li et al.].

ClampedLogSqBarrier

Clamped log barrier with a quadratic log term from [Huang et al.].

CubicBarrier

Cubic barrier function from [Ando 2024].

NormalizedBarrier

Normalized barrier function from [Li et al.].

Functions

Name

Description

ipc::barrier()

Evaluate the barrier function.

ipc::barrier_first_derivative()

Derivative of the barrier function.

ipc::barrier_second_derivative()

Second derivative of the barrier function.

ipc::barrier_force_magnitude()

Compute the barrier force magnitude.

ipc::barrier_force_magnitude_gradient()

Compute the gradient of the barrier force magnitude.

ipc::initial_barrier_stiffness()

Compute the initial barrier stiffness.

ipc::update_barrier_stiffness()

Update the barrier stiffness based on the current state.

ipc::semi_implicit_stiffness()

Compute the semi-implicit stiffness for all collisions.

Function Details

double ipc::barrier(const double dconst double dhat);

Function that grows to infinity as d approaches 0 from the right.

\[ b(d) = -(d-\hat{d})^2\ln\left(\frac{d}{\hat{d}}\right) \]

Parameters:
const double d

The distance.

const double dhat

Activation distance of the barrier.

Returns:

The value of the barrier function at d.

double ipc::barrier_first_derivative(
    
const double dconst double dhat);

Derivative of the barrier function.

\[ b'(d) = (\hat{d}-d) \left( 2\ln\left( \frac{d}{\hat{d}} \right) - \frac{\hat{d}}{d} + 1\right) \]

Parameters:
const double d

The distance.

const double dhat

Activation distance of the barrier.

Returns:

The derivative of the barrier wrt d.

double ipc::barrier_second_derivative(
    
const double dconst double dhat);

Second derivative of the barrier function.

\[ b''(d) = \left( \frac{\hat{d}}{d} + 2 \right) \frac{\hat{d}}{d} - 2\ln\left( \frac{d}{\hat{d}} \right) - 3 \]

Parameters:
const double d

The distance.

const double dhat

Activation distance of the barrier.

Returns:

The second derivative of the barrier wrt d.

Barrier Force Magnitude

double ipc::barrier_force_magnitude(const double distance_squared,
    
const Barrierbarrierconst double dhat,
    
const double barrier_stiffnessconst double dmin = 0);

Compute the magnitude of the force due to a barrier.

Parameters:
const double distance_squared

The squared distance between elements.

const Barrier &barrier

The barrier function.

const double dhat

The activation distance of the barrier.

const double barrier_stiffness

The stiffness of the barrier.

const double dmin = 0

The minimum distance offset to the barrier.

Returns:

The magnitude of the force.

VectorMax12d ipc::barrier_force_magnitude_gradient(
    
const double distance_squared,
    
Eigen::ConstRef<VectorMax12d> distance_squared_gradient,
    
const Barrierbarrierconst double dhat,
    
const double barrier_stiffnessconst double dmin = 0);

Compute the gradient of the magnitude of the force due to a barrier.

Parameters:
const double distance_squared

The squared distance between elements.

Eigen::ConstRef<VectorMax12d> distance_squared_gradient

The gradient of the squared distance.

const Barrier &barrier

The barrier function.

const double dhat

The activation distance of the barrier.

const double barrier_stiffness

The stiffness of the barrier.

const double dmin = 0

The minimum distance offset to the barrier.

Returns:

The gradient of the force.

Adaptive Barrier Stiffness

double ipc::initial_barrier_stiffness(const double bbox_diagonal,
    
const Barrierbarrierconst double dhat,
    
const double average_mass,
    
Eigen::ConstRef<Eigen::VectorXd> grad_energy,
    
Eigen::ConstRef<Eigen::VectorXd> grad_barrier,
    
double& max_barrier_stiffness,
    
const double min_barrier_stiffness_scale = 1e11,
    
const double dmin = 0);

Compute an inital barrier stiffness using the barrier potential gradient.

Parameters:
const double bbox_diagonal

[in] Length of the diagonal of the bounding box of the scene.

const Barrier &barrier

[in] Barrier function.

const double dhat

[in] Activation distance of the barrier.

const double average_mass

[in] Average mass of all bodies.

Eigen::ConstRef<Eigen::VectorXd> grad_energy

[in] Gradient of the elasticity energy function.

Eigen::ConstRef<Eigen::VectorXd> grad_barrier

[in] Gradient of the barrier potential.

double &max_barrier_stiffness

[out] Maximum stiffness of the barrier.

const double min_barrier_stiffness_scale = 1e11

[in] Scale used to premultiply the minimum barrier stiffness.

const double dmin = 0

[in] Minimum distance between elements.

Returns:

The initial barrier stiffness.

double ipc::update_barrier_stiffness(const double prev_min_distance,
    
const double min_distanceconst double max_barrier_stiffness,
    
const double barrier_stiffnessconst double bbox_diagonal,
    
const double dhat_epsilon_scale = 1e-9const double dmin = 0);

Update the barrier stiffness if the distance is decreasing and less than dhat_epsilon_scale * diag.

Parameters:
const double prev_min_distance

[in] Previous minimum distance between elements.

const double min_distance

[in] Current minimum distance between elements.

const double max_barrier_stiffness

[in] Maximum stiffness of the barrier.

const double barrier_stiffness

[in] Current barrier stiffness.

const double bbox_diagonal

[in] Length of the diagonal of the bounding box of the scene.

const double dhat_epsilon_scale = 1e-9

[in] Update if distance is less than this fraction of the diagonal.

const double dmin = 0

[in] Minimum distance between elements.

Returns:

The updated barrier stiffness.

Semi-Implicit Stiffness

template <typename StencilsT>
Eigen::VectorXd ipc::semi_implicit_stiffness(
    
const CollisionMeshmesh,
    
Eigen::ConstRef<Eigen::MatrixXd> vertices,
    
const StencilsTcollisions,
    
Eigen::ConstRef<Eigen::VectorXd> vertex_masses,
    
const Eigen::SparseMatrix<double>& hessconst double dmin);

Compute the semi-implicit stiffness’s for all collisions.

Note

See [Ando 2024] for details.

Parameters:
const CollisionMesh &mesh

Collision mesh.

Eigen::ConstRef<Eigen::MatrixXd> vertices

Vertex positions.

const StencilsT &collisions

Normal collisions or collision candidates.

Eigen::ConstRef<Eigen::VectorXd> vertex_masses

Lumped vertex masses.

const Eigen::SparseMatrix<double> &hess

Hessian of the elasticity energy function.

const double dmin

Minimum distance between elements.

Returns:

The semi-implicit stiffness’s.