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>2014-09-19 18:53:35 +0400
committerLukas Tönne <lukas.toenne@gmail.com>2015-01-20 11:30:02 +0300
commit00bb836e17de349b7e4f9478b1911f8de8e0b334 (patch)
tree0cc3d925cbc772c48ff7710229e34b24dcfb1c0e /source/blender
parente5ae13b809df309569878d2c36f85b695aaf0992 (diff)
Calculate bending targets based on the direction of previous segments.
This makes the bending a truely local effect. Eventually target directions should be based in a local coordinate frame that gets parallel transported along the curve. This will allow non-straight rest shapes for hairs as well as supporting twist forces. However, calculating locally transformed spring forces is more complicated.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/cloth.c4
-rw-r--r--source/blender/physics/intern/BPH_mass_spring.cpp2
-rw-r--r--source/blender/physics/intern/implicit.h2
-rw-r--r--source/blender/physics/intern/implicit_blender.c34
4 files changed, 20 insertions, 22 deletions
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 1b3b668f524..284107ee4e8 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -1302,9 +1302,9 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
return 0;
}
- spring->ij = tspring->kl;
+ spring->ij = tspring2->ij;
spring->kl = tspring->ij;
- spring->mn = tspring2->ij;
+ spring->mn = tspring->kl;
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
spring->type = CLOTH_SPRING_TYPE_BENDING_ANG;
spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp
index 2700f4a0f6d..6a64e17aee2 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -394,7 +394,7 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
scaling = parms->bending + s->stiffness * fabsf(parms->max_bend - parms->bending);
cb = kb = scaling / (20.0f * (parms->avg_spring_len + FLT_EPSILON));
- BPH_mass_spring_force_spring_bending_angular(data, s->ij, s->kl, s->matrix_index, s->restlen, kb, cb, s->f, s->dfdx, s->dfdv);
+ BPH_mass_spring_force_spring_bending_angular(data, s->ij, s->kl, s->mn, s->matrix_index, s->restlen, kb, cb, s->f, s->dfdx, s->dfdv);
#endif
}
}
diff --git a/source/blender/physics/intern/implicit.h b/source/blender/physics/intern/implicit.h
index ac2c942379b..b11bc5d18a9 100644
--- a/source/blender/physics/intern/implicit.h
+++ b/source/blender/physics/intern/implicit.h
@@ -144,7 +144,7 @@ bool BPH_mass_spring_force_spring_bending(struct Implicit_Data *data, int i, int
float kb, float cb,
float r_f[3], float r_dfdx[3][3], float r_dfdv[3][3]);
/* Angular bending force based on local target vectors */
-bool BPH_mass_spring_force_spring_bending_angular(struct Implicit_Data *data, int i, int j, int spring_index, float restlen,
+bool BPH_mass_spring_force_spring_bending_angular(struct Implicit_Data *data, int i, int j, int k, int spring_index, float restlen,
float stiffness, float damping,
float r_f[3], float r_dfdx[3][3], float r_dfdv[3][3]);
/* Global goal spring */
diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c
index 84db552d2ff..425dcf9a384 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -1619,28 +1619,32 @@ bool BPH_mass_spring_force_spring_bending(Implicit_Data *data, int i, int j, int
/* Angular spring that pulls the vertex toward the local target
* See "Artistic Simulation of Curly Hair" (Pixar technical memo #12-03a)
*/
-bool BPH_mass_spring_force_spring_bending_angular(Implicit_Data *data, int i, int j, int spring_index, float restlen,
+bool BPH_mass_spring_force_spring_bending_angular(Implicit_Data *data, int i, int j, int k, int spring_index, float restlen,
float stiffness, float damping,
float r_f[3], float r_dfdx[3][3], float r_dfdv[3][3])
{
float target[3], targetdir[3];
- float extent[3], dir[3], length;
+ float extent[3], dir[3];
float dist[3], vel[3];
float f[3], dfdx[3][3], dfdv[3][3];
- target[0] = 0.0f;
- target[1] = 0.0f;
- target[2] = restlen;
+ sub_v3_v3v3(targetdir, data->X[j], data->X[i]);
+ normalize_v3(targetdir);
+ mul_v3_v3fl(target, targetdir, restlen);
+ {
+ float x[3], d[3];
+ root_to_world_v3(data, j, x, data->X[j]);
+ root_to_world_v3(data, j, d, target);
+ BKE_sim_debug_data_add_vector(data->debug_data, x, d, 1, 0, 0, "spoint", hash_vertex(935, j));
+ }
// calculate elonglation
-// spring_length(data, i, j, extent, dir, &length, vel);
- sub_v3_v3v3(extent, data->X[j], data->X[i]);
- sub_v3_v3v3(vel, data->V[j], data->V[i]);
- length = normalize_v3_v3(dir, extent);
- normalize_v3_v3(targetdir, target);
+ sub_v3_v3v3(extent, data->X[k], data->X[j]);
+ sub_v3_v3v3(vel, data->V[k], data->V[j]);
+ normalize_v3_v3(dir, extent);
sub_v3_v3v3(dist, target, extent);
- mul_v3_v3fl(f, dist, stiffness);
+ mul_v3_v3fl(f, dist, -stiffness);
madd_v3_v3fl(vel, dir, -dot_v3v3(vel, dir));
madd_v3_v3fl(f, vel, damping);
@@ -1648,13 +1652,7 @@ bool BPH_mass_spring_force_spring_bending_angular(Implicit_Data *data, int i, in
zero_m3(dfdx);
zero_m3(dfdv);
-// outerproduct(dfdx, dir, dir);
-// mul_m3_fl(dfdx, fbstar_jacobi(length, restlen, kb, cb));
-
- /* XXX damping not supported */
-// zero_m3(dfdv);
-
- apply_spring(data, i, j, spring_index, f, dfdx, dfdv);
+ apply_spring(data, j, k, spring_index, f, dfdx, dfdv);
if (r_f) copy_v3_v3(r_f, f);
if (r_dfdx) copy_m3_m3(r_dfdx, dfdx);