[Bf-blender-cvs] [72c78837ee2] soc-2020-soft-body: disabling self collision until detection is better

mattoverby noreply at git.blender.org
Wed Jul 29 00:09:54 CEST 2020


Commit: 72c78837ee280b281cf728aba11c5cbd23a675c2
Author: mattoverby
Date:   Tue Jul 28 17:09:50 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rB72c78837ee280b281cf728aba11c5cbd23a675c2

disabling self collision until detection is better

===================================================================

M	extern/softbody/src/admmpd_collision.cpp
M	extern/softbody/src/admmpd_collision.h
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

===================================================================

diff --git a/extern/softbody/src/admmpd_collision.cpp b/extern/softbody/src/admmpd_collision.cpp
index cf36c3ce009..ee982cb3f26 100644
--- a/extern/softbody/src/admmpd_collision.cpp
+++ b/extern/softbody/src/admmpd_collision.cpp
@@ -100,6 +100,7 @@ EmbeddedMeshCollision::EmbeddedMeshCollision(std::shared_ptr<EmbeddedMesh> mesh_
 
 
 int EmbeddedMeshCollision::detect(
+	const admmpd::Options *options,
 	const Eigen::MatrixXd *x0,
 	const Eigen::MatrixXd *x1)
 {
@@ -107,10 +108,9 @@ int EmbeddedMeshCollision::detect(
 		return 0;
 
 	// Do we even need to process collisions?
-	if ((!this->settings.obs_collision || !obsdata.has_obs()) &&
-		!this->settings.self_collision)
+	if (!this->obsdata.has_obs() && !options->self_collision)
 	{
-		if (x1->col(1).minCoeff() > this->settings.floor_z)
+		if (x1->col(1).minCoeff() > options->floor)
 		{
 			return 0;
 		}
@@ -129,7 +129,7 @@ int EmbeddedMeshCollision::detect(
 	// Thread data for detection
 	//
 	typedef struct {
-		const Collision::Settings *settings;
+		const Options *options;
 		const Collision *collision;
 		const EmbeddedMesh *embmesh;
 		const Collision::ObstacleData *obsdata;
@@ -156,23 +156,20 @@ int EmbeddedMeshCollision::detect(
 		Vector3d pt_t1 = td->embmesh->get_mapped_facet_vertex(*td->x1,vi);
 
 		// Special case, check if we are below the floor
-		if (td->settings->floor_collision)
+		if (pt_t1[2] < td->options->floor)
 		{
-			if (pt_t1[2] < td->settings->floor_z)
-			{
-				vi_pairs.emplace_back();
-				VFCollisionPair &pair = vi_pairs.back();
-				pair.p_idx = vi;
-				pair.p_is_obs = false;
-				pair.q_idx = -1;
-				pair.q_is_obs = 1;
-				pair.q_bary.setZero();
-				pair.q_pt = Vector3d(pt_t1[0],pt_t1[1],td->settings->floor_z);
-			}
+			vi_pairs.emplace_back();
+			VFCollisionPair &pair = vi_pairs.back();
+			pair.p_idx = vi;
+			pair.p_is_obs = false;
+			pair.q_idx = -1;
+			pair.q_is_obs = 1;
+			pair.q_bary.setZero();
+			pair.q_pt = Vector3d(pt_t1[0],pt_t1[1],td->options->floor);
 		}
 
 		// Detect against obstacles
-		if (td->settings->obs_collision)
+		if (td->obsdata->has_obs())
 		{
 			std::pair<bool,VFCollisionPair> pt_hit_obs =
 				td->collision->detect_against_obs(pt_t1,td->obsdata);
@@ -185,7 +182,7 @@ int EmbeddedMeshCollision::detect(
 		}
 
 		// Detect against self
-		if (td->settings->self_collision)
+		if (td->options->self_collision)
 		{
 			std::pair<bool,VFCollisionPair> pt_hit_self =
 				td->collision->detect_against_self(vi, pt_t1, td->x1);
@@ -198,7 +195,7 @@ int EmbeddedMeshCollision::detect(
 	}; // end detect for a single embedded vertex
 
 	DetectThreadData thread_data = {
-		.settings = &settings,
+		.options = options,
 		.collision = this,
 		.embmesh = mesh.get(),
 		.obsdata = &obsdata,
diff --git a/extern/softbody/src/admmpd_collision.h b/extern/softbody/src/admmpd_collision.h
index 53ac3078641..632b8f8ca2c 100644
--- a/extern/softbody/src/admmpd_collision.h
+++ b/extern/softbody/src/admmpd_collision.h
@@ -24,21 +24,6 @@ struct VFCollisionPair {
 class Collision {
 public:
 
-    struct Settings {
-        double collision_eps;
-        double floor_z;
-        bool floor_collision;
-        bool obs_collision;
-        bool self_collision;
-        Settings() :
-            collision_eps(1e-10),
-            floor_z(-std::numeric_limits<double>::max()),
-            floor_collision(true),
-            obs_collision(true),
-            self_collision(false)
-            {}
-    } settings;
-
     struct ObstacleData {
         bool has_obs() const { return F.rows()>0; }
         Eigen::MatrixXd V;
@@ -68,6 +53,7 @@ public:
     // Performs collision detection.
     // Returns the number of active constraints.
     virtual int detect(
+        const admmpd::Options *options,
         const Eigen::MatrixXd *x0,
         const Eigen::MatrixXd *x1) = 0;
 
@@ -86,10 +72,6 @@ public:
         const unsigned int *faces,
         int nf);
 
-    // Special case for floor since it's common.
-    virtual void set_floor(double z) { settings.floor_z=z; }
-    virtual double get_floor() const { return settings.floor_z; }
-
     // Linearize the constraints about x and return Jacobian.
     virtual void linearize(
         const Eigen::MatrixXd *x,
@@ -117,6 +99,7 @@ public:
 
     // Performs collision detection and stores pairs
     int detect(
+        const admmpd::Options *options,
         const Eigen::MatrixXd *x0,
         const Eigen::MatrixXd *x1);
 
diff --git a/extern/softbody/src/admmpd_solver.cpp b/extern/softbody/src/admmpd_solver.cpp
index 263faac393d..d524a783b8b 100644
--- a/extern/softbody/src/admmpd_solver.cpp
+++ b/extern/softbody/src/admmpd_solver.cpp
@@ -62,11 +62,14 @@ int Solver::solve(
 
 	update_pin_matrix(mesh,options,data);
 	update_global_matrix(options,data);
+
 	ConjugateGradients cg;
 	cg.init_solve(options,data);
 
+	int substeps = std::max(1,options->substeps);
+	double dt = options->timestep_s / double(substeps);
+
 	int iters = 0;
-	int substeps = 1;//std::max(1,options->substeps);
 	for (int i=0; i<substeps; ++i)
 	{
 		// Init the solve which computes
@@ -89,7 +92,6 @@ int Solver::solve(
 		} // end solver iters
 
 		// Update velocity (if not static solve)
-		double dt = options->timestep_s / double(substeps);
 		if (dt > 0.0)
 			data->v.noalias() = (data->x-data->x_start)*(1.0/dt);
 
@@ -119,7 +121,7 @@ void Solver::init_solve(
 	// - update pin constraint matrix (goal positions)
 	// - set x init guess
 	double dt = std::max(0.0, options->timestep_s) /
-		std::max(1.0, double(options->substeps));
+		double(std::max(1, options->substeps));
 	data->x_start = data->x;
 	for (int i=0; i<nx; ++i)
 	{
@@ -195,7 +197,7 @@ void Solver::update_collisions(
 	if (collision==NULL)
 		return;
 
-	collision->detect(&data->x_start, &data->x);
+	collision->detect(options, &data->x_start, &data->x);
 
 	std::vector<double> d_coeffs;
 	std::vector<Eigen::Triplet<double> > trips;
@@ -354,7 +356,9 @@ void Solver::update_global_matrix(
 	if (data->P.cols() != nx*3)
 		throw_err("update_global_matrix","no pin matrix");
 
-	double dt2 = options->timestep_s * options->timestep_s;
+	double dt = options->timestep_s /
+		double(std::max(1,options->substeps));
+	double dt2 = dt*dt;
 	if (dt2 < 0) // static solve
 		dt2 = 1.0;
 
diff --git a/extern/softbody/src/admmpd_types.h b/extern/softbody/src/admmpd_types.h
index 9b9792d6a85..0d3016f4aeb 100644
--- a/extern/softbody/src/admmpd_types.h
+++ b/extern/softbody/src/admmpd_types.h
@@ -36,6 +36,7 @@ struct Options {
     double poisson; // Poisson ratio // TODO variable per-tet
     double density_kgm3; // density of mesh
     double floor; // floor location
+    double collision_thickness;
     bool self_collision; // process self collisions
     Eigen::Vector3d grav;
     Options() :
@@ -46,12 +47,13 @@ struct Options {
         max_gs_iters(100),
         gs_omega(1),
         mult_ck(3),
-        mult_pk(1),
+        mult_pk(3),
         min_res(1e-8),
         youngs(1000000),
         poisson(0.399),
         density_kgm3(1522),
         floor(-std::numeric_limits<double>::max()),
+        collision_thickness(1e-6),
         self_collision(false),
         grav(0,0,-9.8)
         {}
diff --git a/intern/softbody/admmpd_api.cpp b/intern/softbody/admmpd_api.cpp
index 980ecc20e34..9eef0552b5a 100644
--- a/intern/softbody/admmpd_api.cpp
+++ b/intern/softbody/admmpd_api.cpp
@@ -74,6 +74,7 @@ static inline void options_from_object(Object *ob, admmpd::Options *op)
   op->poisson = std::max(0.f,std::min(0.499f,sb->admmpd_poisson));
   op->floor = sb->admmpd_floor_z;
   op->self_collision = sb->admmpd_self_collision;
+  op->substeps = sb->admmpd_substeps;
 
   switch(sb->admmpd_material)
   {
diff --git a/release/scripts/startup/bl_ui/properties_physics_softbody.py b/release/scripts/startup/bl_ui/properties_physics_softbody.py
index fcf31cd5112..f42cc5132e0 100644
--- a/release/scripts/startup/bl_ui/properties_physics_softbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py
@@ -337,7 +337,6 @@ class PHYSICS_PT_softbody_admmpdcollision(PhysicButtonsPanel, Panel):
         layout.use_property_split = True
         md = context.soft_body
         softbody = md.settings
-        layout.prop(softbody, "admmpd_self_collision")
         layout.prop(softbody, "admmpd_collisionstiff")
         layout.prop(softbody, "admmpd_floor_z")



More information about the Bf-blender-cvs mailing list