Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2016-06-08 11:32:11 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2016-06-08 11:32:11 +0300
commite623d6b223f4fb6f9ff03aef3e81c4b433692c7b (patch)
treeb32a2a6422e0895c42e2e25e8f36a58f7d9267bf /source/blender/physics
parent1345865dcdcb5575831c74930aff538366acf61e (diff)
Fix cloth stability when in perfect rest shape.
The way cloth is coded, structural springs are only effective when stretched, while bending springs act only when shrunk. However, when cloth is exactly in its rest shape, neither have any effect, and effectively don't exist for the implicit solver. This creates a stability problem in the initial frames of the simulation, especially considering that gravity seems to act so precisely that it doesn't disturb the strict equality of lengths, so in parts of the cloth this springless state can continue for quite a while. Here is an example of things going haywire because of this and some suspicious logic in collision code acting together: {F314558} Changing the condition so that structural springs are active even at exactly rest length fixes this test case. The use of >= is also supported by the original paper that the cloth implementation in blender is based on. Reviewers: lukastoenne Reviewed By: lukastoenne Projects: #bf_blender Differential Revision: https://developer.blender.org/D2028
Diffstat (limited to 'source/blender/physics')
-rw-r--r--source/blender/physics/intern/implicit_blender.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c
index 832d516b839..2ad8ee0547f 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -1586,8 +1586,11 @@ bool BPH_mass_spring_force_spring_linear(Implicit_Data *data, int i, int j, floa
// calculate elonglation
spring_length(data, i, j, extent, dir, &length, vel);
-
- if (length > restlen || no_compress) {
+
+ /* This code computes not only the force, but also its derivative.
+ Zero derivative effectively disables the spring for the implicit solver.
+ Thus length > restlen makes cloth unconstrained at the start of simulation. */
+ if ((length >= restlen && length > 0) || no_compress) {
float stretch_force, f[3], dfdx[3][3], dfdv[3][3];
stretch_force = stiffness * (length - restlen);