[Bf-blender-cvs] [8326a9ac7cd] soc-2020-soft-body: updated how stiffnesses are shown in gui
mattoverby
noreply at git.blender.org
Wed Aug 12 02:30:09 CEST 2020
Commit: 8326a9ac7cdf199450609535a91304459cb155b3
Author: mattoverby
Date: Tue Aug 11 19:30:05 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rB8326a9ac7cdf199450609535a91304459cb155b3
updated how stiffnesses are shown in gui
===================================================================
M extern/softbody/src/admmpd_collision.cpp
M extern/softbody/src/admmpd_linsolve.cpp
M extern/softbody/src/admmpd_mesh.cpp
M extern/softbody/src/admmpd_solver.cpp
M extern/softbody/src/admmpd_types.h
M intern/softbody/admmpd_api.cpp
M release/scripts/startup/bl_ui/properties_physics_softbody.py
M source/blender/blenkernel/intern/softbody.c
M source/blender/makesdna/DNA_object_force_types.h
M source/blender/makesrna/intern/rna_object_force.c
===================================================================
diff --git a/extern/softbody/src/admmpd_collision.cpp b/extern/softbody/src/admmpd_collision.cpp
index 0ef217b0c99..c9609c1da03 100644
--- a/extern/softbody/src/admmpd_collision.cpp
+++ b/extern/softbody/src/admmpd_collision.cpp
@@ -93,6 +93,7 @@ Collision::detect_against_obs(
(void)(mesh);
(void)(options);
(void)(data);
+ (void)(pt_t0);
std::pair<bool,VFCollisionPair> ret =
std::make_pair(false, VFCollisionPair());
@@ -320,6 +321,9 @@ void EmbeddedMeshCollision::update_bvh(
const Eigen::MatrixXd *x1,
bool sort)
{
+ (void)(options);
+ (void)(x0);
+
if (!mesh)
return;
@@ -360,7 +364,11 @@ EmbeddedMeshCollision::detect_against_self(
const Eigen::MatrixXd *x0,
const Eigen::MatrixXd *x1) const
{
- (void)(pt_t0); (void)(x0);
+ (void)(pt_t0);
+ (void)(x0);
+ (void)(options);
+ (void)(data);
+
std::pair<bool,VFCollisionPair> ret =
std::make_pair(false, VFCollisionPair());
@@ -516,6 +524,7 @@ void EmbeddedMeshCollision::linearize(
std::vector<Eigen::Triplet<double> > *trips,
std::vector<double> *d) const
{
+ (void)(data);
BLI_assert(x != NULL);
BLI_assert(x->cols() == 3);
diff --git a/extern/softbody/src/admmpd_linsolve.cpp b/extern/softbody/src/admmpd_linsolve.cpp
index 87e10cc357b..bd06f5910a7 100644
--- a/extern/softbody/src/admmpd_linsolve.cpp
+++ b/extern/softbody/src/admmpd_linsolve.cpp
@@ -42,12 +42,11 @@ void LDLT::init_solve(
// If we've changed the stiffness but not the pins,
// the P matrix is still changing
- double pk = options->mult_pk * data->A_diag_max;
- if (std::abs(pk-data->ls.last_pk) > 1e-8 && trips.size()>0)
+ if (std::abs(options->pk-data->ls.last_pk) > 1e-8 && trips.size()>0)
new_P = true;
// Compute P
- data->ls.last_pk = pk;
+ data->ls.last_pk = options->pk;
int np = q_coeffs.size()/3;
SparseMatrix<double> P;
MatrixXd q;
@@ -72,14 +71,12 @@ void LDLT::init_solve(
q(i,1) = q_coeffs[i*3+1];
q(i,2) = q_coeffs[i*3+2];
}
- data->ls.Ptq = pk * P.transpose() * q;
+ data->ls.Ptq = options->pk * P.transpose() * q;
}
if (!data->ls.ldlt_A_PtP)
data->ls.ldlt_A_PtP = std::make_unique<Cholesky>();
-std::cout << "factoring" << std::endl;
-
// Compute A + P'P and factorize:
// 1) A not computed
// 2) P has changed
@@ -88,7 +85,7 @@ std::cout << "factoring" << std::endl;
data->ls.A_PtP.nonZeros()==0 ||
new_P)
{
- data->ls.A_PtP = SparseMatrix<double>(data->A) + pk * P.transpose()*P;
+ data->ls.A_PtP = SparseMatrix<double>(data->A) + options->pk * P.transpose()*P;
data->ls.ldlt_A_PtP->compute(data->ls.A_PtP);
if(data->ls.ldlt_A_PtP->info() != Eigen::Success)
throw_err("init_solve","facorization failed");
@@ -149,9 +146,8 @@ void LDLT::solve(
// Otherwise we have to solve the full system:
// (A + PtP + CtC) x = b + Ptq + Ctd
- double ck = options->mult_ck * data->A_diag_max;
- data->ls.A_PtP_CtC_3 = data->ls.A_PtP_3 + ck * C.transpose()*C;
- VectorXd Ctd3 = ck * C.transpose() * d;
+ data->ls.A_PtP_CtC_3 = data->ls.A_PtP_3 + options->ck * C.transpose()*C;
+ VectorXd Ctd3 = options->ck * C.transpose() * d;
VectorXd rhs3(nx*3);
for (int i=0; i<nx; ++i)
{
@@ -240,8 +236,8 @@ void ConjugateGradients::solve(
};
// Linearize collision constraints
- RowSparseMatrix<double> C;
- VectorXd d;
+ RowSparseMatrix<double> C(1,nx*3);
+ VectorXd d = VectorXd::Zero(1);
if (collision != nullptr)
{
std::vector<double> d_coeffs;
@@ -255,11 +251,6 @@ void ConjugateGradients::solve(
C.setFromTriplets(trips.begin(),trips.end());
}
}
- else
- {
- C.resize(1,nx*3);
- d = VectorXd::Zero(1);
- }
// Compute RHS
data->ls.rhs.noalias() =
@@ -277,9 +268,8 @@ void ConjugateGradients::solve(
// Otherwise we have to replicate the system
// (A + PtP + CtC) x = Mxbar + DtW2(z-u) + Ptq
- double ck = options->mult_ck * data->A_diag_max;
- data->ls.A_PtP_CtC_3 = data->ls.A_PtP_3 + ck * C.transpose()*C;
- map_vector_to_matrix(ck*C.transpose()*d, data->ls.Ctd);
+ data->ls.A_PtP_CtC_3 = data->ls.A_PtP_3 + options->ck * C.transpose()*C;
+ map_vector_to_matrix(options->ck*C.transpose()*d, data->ls.Ctd);
data->ls.rhs.noalias() += data->ls.Ctd;
// Grab refs for convenience
diff --git a/extern/softbody/src/admmpd_mesh.cpp b/extern/softbody/src/admmpd_mesh.cpp
index 52d8e2d0cda..d130b6345b0 100644
--- a/extern/softbody/src/admmpd_mesh.cpp
+++ b/extern/softbody/src/admmpd_mesh.cpp
@@ -228,8 +228,8 @@ bool EmbeddedMesh::compute_embedding()
{
(void)(tls);
FindTetThreadData *td = (FindTetThreadData*)userdata;
- const MatrixXd *emb_V0 = td->emb_mesh->rest_facet_verts();
- Vector3d pt = emb_V0->row(i);
+ const MatrixXd *emb_x0 = td->emb_mesh->rest_facet_verts();
+ Vector3d pt = emb_x0->row(i);
PointInTetMeshTraverse<double> traverser(
pt,
td->lat_V0,
@@ -421,18 +421,26 @@ bool EmbeddedMesh::linearize_pins(
q.emplace_back(qi[i]*ki);
}
+ double btb = 1;//bary.dot(bary);
+
if (replicate)
{
for (int i=0; i<3; ++i)
{
for (int j=0; j<4; ++j)
- trips.emplace_back(p_idx*3+i, tet[j]*3+i, bary[j]*ki);
+ {
+ double wi = bary[j]/btb;
+ trips.emplace_back(p_idx*3+i, tet[j]*3+i, wi*ki);
+ }
}
}
else
{
for (int j=0; j<4; ++j)
- trips.emplace_back(p_idx, tet[j], bary[j]*ki);
+ {
+ double wi = bary[j]/btb;
+ trips.emplace_back(p_idx, tet[j], wi*ki);
+ }
}
}
diff --git a/extern/softbody/src/admmpd_solver.cpp b/extern/softbody/src/admmpd_solver.cpp
index dcc13489967..8a35da1e6b7 100644
--- a/extern/softbody/src/admmpd_solver.cpp
+++ b/extern/softbody/src/admmpd_solver.cpp
@@ -334,13 +334,9 @@ void Solver::init_matrices(
data->D.setFromTriplets(trips.begin(), trips.end());
data->DtW2 = data->D.transpose() * W2;
data->A = data->DtW2 * data->D;
- data->A_diag_max = 0;
for (int i=0; i<nx; ++i)
{
data->A.coeffRef(i,i) += data->m[i]/dt2;
- double Aii = data->A.coeff(i,i);
- if (Aii > data->A_diag_max)
- data->A_diag_max = Aii;
}
// ADMM dual/lagrange
diff --git a/extern/softbody/src/admmpd_types.h b/extern/softbody/src/admmpd_types.h
index f06830c99f9..e3d5e796504 100644
--- a/extern/softbody/src/admmpd_types.h
+++ b/extern/softbody/src/admmpd_types.h
@@ -67,8 +67,8 @@ struct Options {
int collision_mode;
int substeps; // used externally, ignore in solve()
double gs_omega; // Gauss-Seidel relaxation
- double mult_ck; // stiffness multiplier for constraints
- double mult_pk; // (global) stiffness multiplier for pins
+ double ck; // collision stiffness
+ double pk; // pin stiffness
double min_res; // exit tolerance for global step
double youngs; // Young's modulus // TODO variable per-tet
double poisson; // Poisson ratio // TODO variable per-tet
@@ -89,8 +89,8 @@ struct Options {
collision_mode(COLLISIONMODE_DISCRETE),
substeps(1),
gs_omega(1),
- mult_ck(3),
- mult_pk(3),
+ ck(10000),
+ pk(10000),
min_res(1e-6),
youngs(1000000),
poisson(0.399),
@@ -117,7 +117,6 @@ public:
RowSparseMatrix<double> DtW2; // D'W'W
RowSparseMatrix<double> A; // M + DtW'WD
RowSparseMatrix<double> W; // weight matrix
- double A_diag_max; // Max coeff of diag of A
// Set in append_energies:
std::vector<std::set<int> > energies_graph; // per-vertex adjacency list (graph)
std::vector<Eigen::Vector3i> indices; // per-energy index into D (row, num rows, type)
diff --git a/intern/softbody/admmpd_api.cpp b/intern/softbody/admmpd_api.cpp
index d4cae9b18fd..db9bfee8f9d 100644
--- a/intern/softbody/admmpd_api.cpp
+++ b/intern/softbody/admmpd_api.cpp
@@ -88,8 +88,8 @@ static inline void options_from_object(
// Set options that don't require a re-initialization
op->max_admm_iters = std::max(1,sb->admmpd_max_admm_iters);
op->min_res = std::max(0.f,sb->admmpd_converge_eps);
- op->mult_pk = std::max(0.f,std::min(1.f,sb->admmpd_goalstiff));
- op->mult_ck = std::max(0.f,std::min(1.f,sb->admmpd_collisionstiff));
+ op->pk = std::pow(10.f, sb->admmpd_pk_exp);
+ op->ck = std::pow(10.f, sb->admmpd_ck_exp);
op->floor = sb->admmpd_floor_z;
op->self_collision = sb->admmpd_self_collision;
op->log_level = std::max(0, std::min(LOGLEVEL_NUM-1, sb->admmpd_loglevel));
@@ -106,7 +106,7 @@ static inline void options_from_object(
op->timestep_s = (1.0/fps) / float(std::max(1,sb->admmpd_substeps));
}
op->density_kgm3 = std::max(1.f,sb->admmpd_density_kgm3);
- op->youngs = std::pow(10.f, std::max(0.f,sb->admmpd_youngs_exp));
+ op->youngs = std::pow(10.f, sb->admmpd_youngs_exp);
op->poisson = std::max(0.f,std::min(0.499f,sb->admmpd_poisson));
op->elastic_material = std::max(0, std::min(ELASTIC_NUM-1, sb->admmpd_material));
op->substeps = std::max(1,sb->admmpd_substeps);
diff --git a/release/scripts/startup/bl_ui/properties_physics_softbody.py b/release/scripts/startup/bl_ui/properties_physics_softbody.py
index a39b0c4c7ce..a3d728dc2a5 100644
--- a/release/scripts/startup/bl_ui/properties_physics_softbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py
@@ -159,7 +159,7 @@ class PHYSICS_PT_softbody_goal(PhysicButtonsPanel, Panel):
layout.prop_search(softbody, "vertex_group_goal", ob, "vertex_groups", text="Vertex Group")
if softbody.solver_mode == 'ADMMPD':
- layout.prop(softbody, "admmpd_goalstiff")
+ layout.prop(softbody, "admmpd_pk_exp")
class PHYSICS_PT_softbody_goal_strengths(PhysicButtonsPanel, Panel):
@@ -341,7 +341,7 @@ class PHYSICS_PT_softbody_admmpdcollision(PhysicButtonsPanel, Panel):
softbody = md.settings
layout.enabled = softbody_panel_enabled(md)
layout.prop(softbody, "admmpd_self_collision")
- layout.prop(softbody, "admmpd_collisionstiff")
+ layout.prop(softbody, "admmpd_ck_exp")
layout.prop(softbody, "admmpd_floor_z")
class PHYSICS_PT_softbody_collision(PhysicButtonsPanel, Panel):
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 75fbea9c958..e742fc2ea1a 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -3134,8 +3134,8 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list