[Bf-blender-cvs] [77129b3] hair_system: Bending forces and damping for hair.

Lukas Tönne noreply at git.blender.org
Tue Jul 29 15:47:44 CEST 2014


Commit: 77129b399d21fdd0376efbb0daaf22dbc2abfd90
Author: Lukas Tönne
Date:   Tue Jul 29 15:44:29 2014 +0200
Branches: hair_system
https://developer.blender.org/rB77129b399d21fdd0376efbb0daaf22dbc2abfd90

Bending forces and damping for hair.

This adds some stiffness to hairs along bends, such that the hair does
no longer behave like a chain of freely rotating segments.

Note that there is no bending force on the root segment yet, which means
the hair swivels around the root point without resistance.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/hair/intern/HAIR_solver.cpp
M	source/blender/hair/intern/HAIR_solver.h
M	source/blender/makesdna/DNA_hair_types.h
M	source/blender/makesrna/intern/rna_hair.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 9d6ebae..2f1fca4 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1235,8 +1235,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row = col.row()
         col2 = row.column()
         col2.prop(params, "stretch_stiffness")
+        col2.prop(params, "bend_stiffness")
         col2 = row.column()
         col2.prop(params, "stretch_damping")
+        col2.prop(params, "bend_damping")
         
         col.separator()
         
diff --git a/source/blender/hair/intern/HAIR_solver.cpp b/source/blender/hair/intern/HAIR_solver.cpp
index be2c38c..433fecd 100644
--- a/source/blender/hair/intern/HAIR_solver.cpp
+++ b/source/blender/hair/intern/HAIR_solver.cpp
@@ -64,9 +64,8 @@ SolverData::~SolverData()
 
 static float3 calc_bend(const Frame &frame, const float3 &co0, const float3 &co1)
 {
-	float3 dir;
-	normalize_v3_v3(dir, co1 - co0);
-	return float3(dot_v3_v3(dir, frame.normal), dot_v3_v3(dir, frame.tangent), dot_v3_v3(dir, frame.cotangent));
+	float3 edge = co1 - co0;
+	return float3(dot_v3_v3(edge, frame.normal), dot_v3_v3(edge, frame.tangent), dot_v3_v3(edge, frame.cotangent));
 }
 
 void SolverData::precompute_rest_bend()
@@ -150,7 +149,7 @@ float3 Solver::calc_velocity(Curve *curve, Point *point, float time, Point::Stat
 	return state.vel;
 }
 
-float3 Solver::calc_stretch(Curve *curve, Point *point0, Point *point1, float time) const
+float3 Solver::calc_stretch_force(Curve *curve, Point *point0, Point *point1, float time) const
 {
 	/* XXX this could be cached in SolverData */
 	float3 dir;
@@ -164,14 +163,34 @@ float3 Solver::calc_stretch(Curve *curve, Point *point0, Point *point1, float ti
 	return stretch_force + stretch_damp;
 }
 
-float3 Solver::calc_acceleration(Curve *curve, Point *point, float time, float3 prev_stretch, float3 stretch, Point::State &state) const
+#if 0
+float3 Solver::calc_bend_force(Curve *curve, const Frame &frame, Point *point0, Point *point1, float time) const
+{
+	float3 bend = calc_bend(frame, point0->cur.co, point1->cur.co);
+	
+	
+}
+#endif
+
+float3 Solver::calc_bend_force(Curve *curve, Point *point0, Point *point1, float time) const
+{
+	float3 dir;
+	float3 edge = point1->cur.co - point0->cur.co;
+	normalize_v3_v3(dir, edge);
+	float3 dvel = point1->cur.vel - point0->cur.vel;
+	
+	float3 bend_force = m_params.bend_stiffness * (edge - point0->rest_bend);
+	float3 bend_damp = m_params.bend_damping * (dvel - dot_v3_v3(dvel, dir) * dir);
+	
+	return bend_force + bend_damp;
+}
+
+float3 Solver::calc_acceleration(Curve *curve, Point *point, float time, Point::State &state) const
 {
 	float3 acc = float3(0.0f, 0.0f, 0.0f);
 	
 	acc = acc + m_forces.gravity;
 	
-	acc = acc - prev_stretch + stretch;
-	
 	return acc;
 }
 
@@ -187,7 +206,7 @@ void Solver::step(float timestep)
 	
 	for (i = 0, curve = m_data->curves; i < totcurve; ++i, ++curve) {
 		int numpoints = curve->totpoints;
-		float3 prev_stretch;
+		float3 stretch, prev_stretch, bend, prev_bend;
 		
 		/* Root point animation */
 		k = 0;
@@ -197,20 +216,37 @@ void Solver::step(float timestep)
 		point->next.co = point->cur.co;
 		point->next.vel = float3(0.0f, 0.0f, 0.0f);
 		
-		float3 stretch = k < numpoints-1 ? calc_stretch(curve, point, point+1, time) : float3(0.0f, 0.0f, 0.0f);
+		if (k < numpoints-1) {
+			stretch = calc_stretch_force(curve, point, point+1, time);
+			bend = calc_bend_force(curve, point, point+1, time);
+		}
+		else {
+			stretch = float3(0.0f, 0.0f, 0.0f);
+			bend = float3(0.0f, 0.0f, 0.0f);
+		}
 		prev_stretch = stretch;
+		prev_bend = bend;
 		
 		/* Integrate the remaining free points */
 		for (++k, ++point; k < numpoints; ++k, ++point) {
-			float3 stretch = k < numpoints-1 ? calc_stretch(curve, point, point+1, time) : float3(0.0f, 0.0f, 0.0f);
+			if (k < numpoints-1) {
+				stretch = calc_stretch_force(curve, point, point+1, time);
+				bend = calc_bend_force(curve, point, point+1, time);
+			}
+			else {
+				stretch = float3(0.0f, 0.0f, 0.0f);
+				bend = float3(0.0f, 0.0f, 0.0f);
+			}
 			
-			float3 acc = calc_acceleration(curve, point, time, prev_stretch, stretch, point->cur);
+			float3 acc = calc_acceleration(curve, point, time, point->cur);
+			acc = acc - prev_stretch + stretch - prev_bend + bend;
 			point->next.vel = point->cur.vel + acc * timestep;
 			
 			float3 vel = calc_velocity(curve, point, time, point->next);
 			point->next.co = point->cur.co + vel * timestep;
 			
 			prev_stretch = stretch;
+			prev_bend = bend;
 		}
 	}
 	
diff --git a/source/blender/hair/intern/HAIR_solver.h b/source/blender/hair/intern/HAIR_solver.h
index 940d661..8ff5f11 100644
--- a/source/blender/hair/intern/HAIR_solver.h
+++ b/source/blender/hair/intern/HAIR_solver.h
@@ -77,8 +77,9 @@ public:
 	
 protected:
 	float3 calc_velocity(Curve *curve, Point *point, float time, Point::State &state) const;
-	float3 calc_acceleration(Curve *curve, Point *point, float time, float3 prev_stretch, float3 stretch, Point::State &state) const;
-	float3 calc_stretch(Curve *curve, Point *point0, Point *point1, float time) const;
+	float3 calc_acceleration(Curve *curve, Point *point, float time, Point::State &state) const;
+	float3 calc_stretch_force(Curve *curve, Point *point0, Point *point1, float time) const;
+	float3 calc_bend_force(Curve *curve, Point *point0, Point *point1, float time) const;
 	
 private:
 	HairParams m_params;
diff --git a/source/blender/makesdna/DNA_hair_types.h b/source/blender/makesdna/DNA_hair_types.h
index e5433e3..1f93807 100644
--- a/source/blender/makesdna/DNA_hair_types.h
+++ b/source/blender/makesdna/DNA_hair_types.h
@@ -49,7 +49,8 @@ typedef struct HairCurve {
 typedef struct HairParams {
 	float stretch_stiffness;
 	float stretch_damping;
-	int pad[2];
+	float bend_stiffness;
+	float bend_damping;
 } HairParams;
 
 typedef struct HairSystem {
diff --git a/source/blender/makesrna/intern/rna_hair.c b/source/blender/makesrna/intern/rna_hair.c
index 64ee0d0..e5aab41 100644
--- a/source/blender/makesrna/intern/rna_hair.c
+++ b/source/blender/makesrna/intern/rna_hair.c
@@ -71,6 +71,18 @@ static void rna_def_hair_params(BlenderRNA *brna)
 	RNA_def_property_range(prop, 0.0f, 1.0e6f);
 	RNA_def_property_ui_range(prop, 0.0f, 1.0e5f, 0.1, 2);
 	RNA_def_property_ui_text(prop, "Stretch Damping", "");
+
+	prop = RNA_def_property(srna, "bend_stiffness", PROP_FLOAT, PROP_FACTOR);
+	RNA_def_property_float_sdna(prop, NULL, "bend_stiffness");
+	RNA_def_property_range(prop, 0.0f, 1.0e9f);
+	RNA_def_property_ui_range(prop, 0.0f, 1.0e8f, 0.1, 2);
+	RNA_def_property_ui_text(prop, "Bend Stiffness", "");
+
+	prop = RNA_def_property(srna, "bend_damping", PROP_FLOAT, PROP_FACTOR);
+	RNA_def_property_float_sdna(prop, NULL, "bend_damping");
+	RNA_def_property_range(prop, 0.0f, 1.0e6f);
+	RNA_def_property_ui_range(prop, 0.0f, 1.0e5f, 0.1, 2);
+	RNA_def_property_ui_text(prop, "Bend Damping", "");
 }
 
 static void rna_def_hair_system(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list