[Bf-blender-cvs] [56c21ff] cloth-improvements: Implement improved compression model

Luca Rood noreply at git.blender.org
Mon Dec 5 18:51:11 CET 2016


Commit: 56c21ff7074a1a7170351a1de90ed9db519f189b
Author: Luca Rood
Date:   Mon Dec 5 11:42:41 2016 -0200
Branches: cloth-improvements
https://developer.blender.org/rB56c21ff7074a1a7170351a1de90ed9db519f189b

Implement improved compression model

This implements the Choi and Ko compression model, with an added damping
component, instead of using the same model as for tension, which
improves stability of the internal forces.

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

M	source/blender/physics/intern/implicit_blender.c

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

diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c
index 2ef8083..e5a0480 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -1583,35 +1583,40 @@ bool BPH_mass_spring_force_spring_linear(Implicit_Data *data, int i, int j, floa
                                          bool no_compress, float clamp_force)
 {
 	float extent[3], length, dir[3], vel[3];
-	float stiffness, damping;
+	float f[3], dfdx[3][3], dfdv[3][3];
+	float damping = 0;
 
-	// calculate elonglation
+	/* calculate elonglation */
 	spring_length(data, i, j, extent, dir, &length, vel);
-	
-	if (length > restlen) {
-		stiffness = tension;
+
+	/* Calculate tension forces */
+	if (length >= restlen) {
+		float stretch_force;
 		damping = damp_tension;
+
+		stretch_force = tension * (length - restlen);
+		if (clamp_force > 0.0f && stretch_force > clamp_force) {
+			stretch_force = clamp_force;
+		}
+		mul_v3_v3fl(f, dir, stretch_force);
+
+		dfdx_spring(dfdx, dir, length, restlen, tension);
 	}
-	else if (length < restlen) {
-		stiffness = compression;
+
+	/* Calculate compression forces */
+	else if (!no_compress) {
+		float kb = compression;
+		float cb = kb; /* cb equal to kb seems to work, but a factor can be added if necessary */
 		damping = damp_compression;
-	}
-	else {
-		stiffness = (tension + compression) / 2;
-		damping = (damp_tension + damp_compression) / 2;
-	}
 
-	float stretch_force, f[3], dfdx[3][3], dfdv[3][3];
+		mul_v3_v3fl(f, dir, fbstar(length, restlen, kb, cb));
 
-	stretch_force = stiffness * (length - restlen);
-	if (clamp_force > 0.0f && stretch_force > clamp_force) {
-		stretch_force = clamp_force;
+		outerproduct(dfdx, dir, dir);
+		mul_m3_fl(dfdx, fbstar_jacobi(length, restlen, kb, cb));
 	}
-	mul_v3_v3fl(f, dir, stretch_force);
 
+	/* Calculate damping forces */
 	madd_v3_v3fl(f, dir, damping * dot_v3v3(vel, dir));
-
-	dfdx_spring(dfdx, dir, length, restlen, stiffness);
 	dfdv_damp(dfdv, dir, damping);
 
 	apply_spring(data, i, j, f, dfdx, dfdv);




More information about the Bf-blender-cvs mailing list