[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