Barrier¶
Barrier functions and functionals.
Types¶
Name |
Description |
---|---|
Base class for barrier functions. |
|
Smoothly clamped log barrier functions from [Li et al.]. |
|
Clamped log barrier with a quadratic log term from [Huang et al.]. |
|
Cubic barrier function from [Ando 2024]. |
|
Normalized barrier function from [Li et al.]. |
Functions¶
Name |
Description |
---|---|
Evaluate the barrier function. |
|
Derivative of the barrier function. |
|
Second derivative of the barrier function. |
|
Compute the barrier force magnitude. |
|
Compute the gradient of the barrier force magnitude. |
|
Compute the initial barrier stiffness. |
|
Update the barrier stiffness based on the current state. |
|
Compute the semi-implicit stiffness for all collisions. |
Function Details¶
- double ipc::barrier(const double d, const 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) \]
-
double ipc::barrier_first_derivative(
const double d, const 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) \]
-
double ipc::barrier_second_derivative(
const double d, const 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 \]
Barrier Force Magnitude¶
-
double ipc::barrier_force_magnitude(const double distance_squared,
const Barrier& barrier, const double dhat,
const double barrier_stiffness, const double dmin = 0);¶ Compute the magnitude of the force due to a barrier.
-
VectorMax12d ipc::barrier_force_magnitude_gradient(
const double distance_squared,
Eigen::ConstRef<VectorMax12d> distance_squared_gradient,
const Barrier& barrier, const double dhat,
const double barrier_stiffness, const 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 Barrier& barrier, const 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_distance, const double max_barrier_stiffness,
const double barrier_stiffness, const double bbox_diagonal,
const double dhat_epsilon_scale = 1e-9, const 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 CollisionMesh& mesh,
Eigen::ConstRef<Eigen::MatrixXd> vertices,
const StencilsT& collisions,
Eigen::ConstRef<Eigen::VectorXd> vertex_masses,
const Eigen::SparseMatrix<double>& hess, const 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.