Commit: db2ac79fc7ca7d65a3e2912b4b6b5f1ec3b911fd
Author: Lukas Tönne
Date:   Thu Dec 18 13:52:31 2014 +0100
Branches: master
https://developer.blender.org/rBdb2ac79fc7ca7d65a3e2912b4b6b5f1ec3b911fd

Radical simplification of the wind effect on hair, since the previous
approach does not work very well.

Using a cross section estimate still causes large oscillations due to
varying hair force based on angles. It also requires a sensible hair
thickness value (particle radius) which is difficult to control and
visualize at this point.

The new model is based purely on per-vertex forces, which seems to be
much more stable. It's also somewhat justified by the fact that each
hair vertex represents a certain mass.

Conflicts:
        source/blender/physics/intern/BPH_mass_spring.cpp

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

M       source/blender/physics/intern/BPH_mass_spring.cpp
M       source/blender/physics/intern/implicit.h
M       source/blender/physics/intern/implicit_blender.c

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

diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp 
b/source/blender/physics/intern/BPH_mass_spring.cpp
index e9bf376..9e58a13 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -497,6 +497,7 @@ static void cloth_calc_force(ClothModifierData *clmd, float 
UNUSED(frame), ListB
 
                /* Hair has only edges */
                if (cloth->numfaces == 0) {
+#if 0
                        ClothHairData *hairdata = clmd->hairdata;
                        ClothHairData *hair_ij, *hair_kl;
                        
@@ -508,6 +509,16 @@ static void cloth_calc_force(ClothModifierData *clmd, 
float UNUSED(frame), ListB
                                        BPH_mass_spring_force_edge_wind(data, 
spring->ij, spring->kl, hair_ij->radius, hair_kl->radius, winvec);
                        }
                }
+#else
+                       ClothHairData *hairdata = clmd->hairdata;
+                       
+                       vert = cloth->verts;
+                       for (i = 0; i < cloth->numverts; i++, vert++) {
+                               ClothHairData *hair = &hairdata[i];
+                               
+                               BPH_mass_spring_force_vertex_wind(data, i, 
hair->radius, winvec);
+                       }
+#endif
 
                MEM_freeN(winvec);
        }
diff --git a/source/blender/physics/intern/implicit.h 
b/source/blender/physics/intern/implicit.h
index 1c9dccb..0e2d12b 100644
--- a/source/blender/physics/intern/implicit.h
+++ b/source/blender/physics/intern/implicit.h
@@ -112,6 +112,8 @@ void BPH_mass_spring_force_extern(struct Implicit_Data 
*data, int i, const float
 void BPH_mass_spring_force_face_wind(struct Implicit_Data *data, int v1, int 
v2, int v3, int v4, const float (*winvec)[3]);
 /* Wind force, acting on an edge */
 void BPH_mass_spring_force_edge_wind(struct Implicit_Data *data, int v1, int 
v2, float radius1, float radius2, const float (*winvec)[3]);
+/* Wind force, acting on a vertex */
+void BPH_mass_spring_force_vertex_wind(struct Implicit_Data *data, int v, 
float radius, const float (*winvec)[3]);
 /* Linear spring force between two points */
 bool BPH_mass_spring_force_spring_linear(struct Implicit_Data *data, int i, 
int j, float restlen,
                                          float stiffness, float damping, bool 
no_compress, float clamp_force,
diff --git a/source/blender/physics/intern/implicit_blender.c 
b/source/blender/physics/intern/implicit_blender.c
index e632050..9f43e79 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -1493,11 +1493,22 @@ void BPH_mass_spring_force_edge_wind(Implicit_Data 
*data, int v1, int v2, float
        add_v3_v3(data->F[v1], f);
        
        world_to_root_v3(data, v2, win, winvec[v2]);
-       /* use -length to invert edge direction */
        edge_wind_vertex(dir, length, radius2, win, f, dfdx, dfdv);
        add_v3_v3(data->F[v2], f);
 }
 
+void BPH_mass_spring_force_vertex_wind(Implicit_Data *data, int v, float 
UNUSED(radius), const float (*winvec)[3])
+{
+       const float density = 0.01f; /* XXX arbitrary value, corresponds to 
effect of air density */
+       
+       float wind[3];
+       float f[3];
+       
+       world_to_root_v3(data, v, wind, winvec[v]);
+       mul_v3_v3fl(f, wind, density);
+       add_v3_v3(data->F[v], f);
+}
+
 BLI_INLINE void dfdx_spring(float to[3][3], const float dir[3], float length, 
float L, float k)
 {
        // dir is unit length direction, rest is spring's restlength, k is 
spring constant.

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to