Skip to content

File strain_limiting_baraff_witkin.h

File List > constitution > strain_limiting_baraff_witkin.h

Go to the documentation of this file

#pragma once
#include <uipc/constitution/finite_element_constitution.h>
#include <uipc/constitution/elastic_moduli.h>
#include <uipc/common/unit.h>

namespace uipc::constitution
{
class UIPC_CONSTITUTION_API StrainLimitingBaraffWitkinShell : public FiniteElementConstitution
{
    using Base = FiniteElementConstitution;

  public:
    StrainLimitingBaraffWitkinShell(const Json& config = default_config()) noexcept;

    // Separate stretch / shear moduli. The stored thickness is the one-sided
    // collision offset r; stretch uses the full material thickness 2r, while
    // shear is an independently calibrated two-dimensional coefficient.
    void apply_to(geometry::SimplicialComplex& sc,
                  const ElasticModuli2D&       stretch_moduli,
                  const ElasticModuli2D&       shear_moduli,
                  Float                        mass_density = 2e2,
                  Float                        thickness    = 0.001_m,
                  Float                        strain_rate  = 100.0) const;

    // Convenience overload: stretch and shear share one moduli pair.
    void apply_to(geometry::SimplicialComplex& sc,
                  const ElasticModuli2D& moduli = ElasticModuli2D::youngs_poisson(1.0_MPa, 0.49),
                  Float mass_density = 2e2,
                  Float thickness    = 0.001_m,
                  Float strain_rate  = 100.0) const
    {
        apply_to(sc, moduli, moduli, mass_density, thickness, strain_rate);
    }

    static Json default_config() noexcept;

  protected:
    virtual U64 get_uid() const noexcept override;

  private:
    Json m_config;
};
}  // namespace uipc::constitution