[Bf-blender-cvs] [f11046c] temp_merge_gooseberry_hair: Added back external effector forces for the cloth solver.

Lukas Tönne noreply at git.blender.org
Mon Jan 19 20:48:34 CET 2015


Commit: f11046c63417550e55b3b0b8dff34a9855424c14
Author: Lukas Tönne
Date:   Wed Sep 10 23:11:56 2014 +0200
Branches: temp_merge_gooseberry_hair
https://developer.blender.org/rBf11046c63417550e55b3b0b8dff34a9855424c14

Added back external effector forces for the cloth solver.

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

M	source/blender/blenkernel/intern/implicit.h
M	source/blender/blenkernel/intern/implicit_eigen.cpp

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

diff --git a/source/blender/blenkernel/intern/implicit.h b/source/blender/blenkernel/intern/implicit.h
index 4124e52..b33308b 100644
--- a/source/blender/blenkernel/intern/implicit.h
+++ b/source/blender/blenkernel/intern/implicit.h
@@ -42,8 +42,9 @@
 #define CLOTH_FORCE_SPRING_STRUCTURAL
 #define CLOTH_FORCE_SPRING_BEND
 #define CLOTH_FORCE_SPRING_GOAL
+#define CLOTH_FORCE_EFFECTORS
 
-#define IMPLICIT_PRINT_SOLVER_INPUT_OUTPUT
+//#define IMPLICIT_PRINT_SOLVER_INPUT_OUTPUT
 
 BLI_INLINE void implicit_print_matrix_elem(float v)
 {
diff --git a/source/blender/blenkernel/intern/implicit_eigen.cpp b/source/blender/blenkernel/intern/implicit_eigen.cpp
index 1ba9da6..99ccf7c 100644
--- a/source/blender/blenkernel/intern/implicit_eigen.cpp
+++ b/source/blender/blenkernel/intern/implicit_eigen.cpp
@@ -384,7 +384,7 @@ static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, con
 {
 	Cloth *cloth = clmd->clothObject;
 	ClothVertex *verts = cloth->verts;
-	ClothVertex *v1 = &verts[s->ij], *v2 = &verts[s->kl];
+	ClothVertex *v1 = &verts[s->ij]/*, *v2 = &verts[s->kl]*/;
 	float extent[3];
 	float length = 0, dot = 0;
 	float dir[3] = {0, 0, 0};
@@ -402,9 +402,6 @@ static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, con
 	zero_m3(s->dfdv);
 	
 	s->flags &= ~CLOTH_SPRING_FLAG_NEEDED;
-	/* ignore springs between pinned vertices */
-//	if (v1->flags & CLOTH_VERT_FLAG_PINNED && v2->flags & CLOTH_VERT_FLAG_PINNED)
-//		return;
 	
 	// calculate elonglation
 	sub_v3_v3v3(extent, lVector_v3(X, s->kl), lVector_v3(X, s->ij));
@@ -543,6 +540,28 @@ static void cloth_apply_spring_force(ClothModifierData *clmd, ClothSpring *s, lV
 	lMatrix_sub_m3(dFdX, s->dfdx, s->kl, s->ij);
 }
 
+static float calc_nor_area_tri(float nor[3], const float v1[3], const float v2[3], const float v3[3])
+{
+	float n1[3], n2[3];
+	
+	sub_v3_v3v3(n1, v1, v2);
+	sub_v3_v3v3(n2, v2, v3);
+	
+	cross_v3_v3v3(nor, n1, n2);
+	return normalize_v3(nor);
+}
+
+static float calc_nor_area_quad(float nor[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
+{
+	float n1[3], n2[3];
+	
+	sub_v3_v3v3(n1, v1, v3);
+	sub_v3_v3v3(n2, v2, v4);
+	
+	cross_v3_v3v3(nor, n1, n2);
+	return normalize_v3(nor);
+}
+
 static void cloth_calc_force(ClothModifierData *clmd, lVector &F, lMatrix &dFdX, lMatrix &dFdV, const lVector &X, const lVector &V, const lMatrix &M, ListBase *effectors, float time)
 {
 	Cloth *cloth = clmd->clothObject;
@@ -578,6 +597,75 @@ static void cloth_calc_force(ClothModifierData *clmd, lVector &F, lMatrix &dFdX,
 	}
 #endif
 
+#ifdef CLOTH_FORCE_EFFECTORS
+	/* handle external forces like wind */
+	if (effectors) {
+		const float effector_scale = 0.02f;
+		MFace *mfaces = cloth->mfaces;
+		EffectedPoint epoint;
+		lVector winvec(F.rows());
+		winvec.setZero();
+		
+		// precalculate wind forces
+		for (int i = 0; i < cloth->numverts; i++) {
+			pd_point_from_loc(clmd->scene, (float*)lVector_v3(X, i), (float*)lVector_v3(V, i), i, &epoint);
+			pdDoEffectors(effectors, NULL, clmd->sim_parms->effector_weights, &epoint, lVector_v3(winvec, i), NULL);
+		}
+		
+		for (int i = 0; i < cloth->numfaces; i++) {
+			float nor[3], area;
+			float factor;
+			MFace *mf = &mfaces[i];
+			
+			// calculate face normal and area
+			if (mf->v4) {
+				area = calc_nor_area_quad(nor, lVector_v3(X, mf->v1), lVector_v3(X, mf->v2), lVector_v3(X, mf->v3), lVector_v3(X, mf->v4));
+				factor = effector_scale * area * 0.25f;
+			}
+			else {
+				area = calc_nor_area_tri(nor, lVector_v3(X, mf->v1), lVector_v3(X, mf->v2), lVector_v3(X, mf->v3));
+				factor = effector_scale * area / 3.0f;
+			}
+			
+			madd_v3_v3fl(lVector_v3(F, mf->v1), nor, factor * dot_v3v3(lVector_v3(winvec, mf->v1), nor));
+			madd_v3_v3fl(lVector_v3(F, mf->v2), nor, factor * dot_v3v3(lVector_v3(winvec, mf->v2), nor));
+			madd_v3_v3fl(lVector_v3(F, mf->v3), nor, factor * dot_v3v3(lVector_v3(winvec, mf->v3), nor));
+			if (mf->v4)
+				madd_v3_v3fl(lVector_v3(F, mf->v4), nor, factor * dot_v3v3(lVector_v3(winvec, mf->v4), nor));
+		}
+
+		/* Hair has only edges */
+		if (cloth->numfaces == 0) {
+			ClothSpring *spring;
+			float dir[3], length;
+			float factor = 0.01;
+			
+			for (LinkNode *link = cloth->springs; link; link = link->next) {
+				spring = (ClothSpring *)link->link;
+				
+				/* structural springs represent hair strands,
+				 * their length signifies surface area and mass
+				 */
+				if (spring->type != CLOTH_SPRING_TYPE_STRUCTURAL)
+					continue;
+				
+				float *win_ij = lVector_v3(winvec, spring->ij);
+				float *win_kl = lVector_v3(winvec, spring->kl);
+				float win_ortho[3];
+				
+				sub_v3_v3v3(dir, (float*)lVector_v3(X, spring->ij), (float*)lVector_v3(X, spring->kl));
+				length = normalize_v3(dir);
+				
+				madd_v3_v3v3fl(win_ortho, win_ij, dir, -dot_v3v3(win_ij, dir));
+				madd_v3_v3fl(lVector_v3(F, spring->ij), win_ortho, factor * length);
+				
+				madd_v3_v3v3fl(win_ortho, win_kl, dir, -dot_v3v3(win_kl, dir));
+				madd_v3_v3fl(lVector_v3(F, spring->kl), win_ortho, factor * length);
+			}
+		}
+	}
+#endif
+
 #if 0
 	/* Collect forces and derivatives:  F, dFdX, dFdV */
 	Cloth 		*cloth 		= clmd->clothObject;




More information about the Bf-blender-cvs mailing list