Commit: 0066cd1671acfd14b64ec78a00afddf17fef4f1f Author: Lukas Tönne Date: Wed Sep 10 18:55:15 2014 +0200 Branches: hair_immediate_fixes https://developer.blender.org/rB0066cd1671acfd14b64ec78a00afddf17fef4f1f
Correctly implemented and verified gravity, drag, structural springs. =================================================================== 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..9335b4c 100644 --- a/source/blender/blenkernel/intern/implicit.h +++ b/source/blender/blenkernel/intern/implicit.h @@ -41,7 +41,7 @@ #define CLOTH_FORCE_DRAG #define CLOTH_FORCE_SPRING_STRUCTURAL #define CLOTH_FORCE_SPRING_BEND -#define CLOTH_FORCE_SPRING_GOAL +//#define CLOTH_FORCE_SPRING_GOAL #define IMPLICIT_PRINT_SOLVER_INPUT_OUTPUT diff --git a/source/blender/blenkernel/intern/implicit_eigen.cpp b/source/blender/blenkernel/intern/implicit_eigen.cpp index 4f44df9..2cf9815 100644 --- a/source/blender/blenkernel/intern/implicit_eigen.cpp +++ b/source/blender/blenkernel/intern/implicit_eigen.cpp @@ -175,42 +175,21 @@ BLI_INLINE void lMatrix_copy_m3(lMatrix &r, float m[3][3], int i, int j) BLI_INLINE void lMatrix_add_m3(lMatrix &r, float m[3][3], int i, int j) { lMatrix tmp(r.cols(), r.cols()); - if (i == j) { - lMatrix_copy_m3(tmp, m, i, i); - } - else { - lMatrix_copy_m3(tmp, m, i, j); - lMatrix_copy_m3(tmp, m, j, i); - } - + lMatrix_copy_m3(tmp, m, i, j); r += tmp; } BLI_INLINE void lMatrix_sub_m3(lMatrix &r, float m[3][3], int i, int j) { lMatrix tmp(r.cols(), r.cols()); - if (i == j) { - lMatrix_copy_m3(tmp, m, i, i); - } - else { - lMatrix_copy_m3(tmp, m, i, j); - lMatrix_copy_m3(tmp, m, j, i); - } - + lMatrix_copy_m3(tmp, m, i, j); r -= tmp; } BLI_INLINE void lMatrix_madd_m3(lMatrix &r, float m[3][3], float s, int i, int j) { lMatrix tmp(r.cols(), r.cols()); - if (i == j) { - lMatrix_copy_m3(tmp, m, i, i); - } - else { - lMatrix_copy_m3(tmp, m, i, j); - lMatrix_copy_m3(tmp, m, j, i); - } - + lMatrix_copy_m3(tmp, m, i, j); r += s * tmp; } @@ -341,7 +320,7 @@ BLI_INLINE void dfdx_spring(float to[3][3], const float dir[3], float length, fl mul_m3_fl(to, (L/length)); sub_m3_m3m3(to, to, I); - mul_m3_fl(to, -k); + mul_m3_fl(to, k); } /* unused */ @@ -356,16 +335,54 @@ BLI_INLINE void dfdx_damp(float to[3][3], const float dir[3], float length, cons } #endif -DO_INLINE void dfdv_damp(float to[3][3], const float dir[3], float damping) +BLI_INLINE void dfdv_damp(float to[3][3], const float dir[3], float damping) { // derivative of force wrt velocity outerproduct(to, dir, dir); - mul_m3_fl(to, damping); + mul_m3_fl(to, -damping); +} + +BLI_INLINE float fb(float length, float L) +{ + float x = length / L; + return (-11.541f * powf(x, 4) + 34.193f * powf(x, 3) - 39.083f * powf(x, 2) + 23.116f * x - 9.713f); +} + +BLI_INLINE float fbderiv(float length, float L) +{ + float x = length/L; + + return (-46.164f * powf(x, 3) + 102.579f * powf(x, 2) - 78.166f * x + 23.116f); +} + +BLI_INLINE float fbstar(float length, float L, float kb, float cb) +{ + float tempfb_fl = kb * fb(length, L); + float fbstar_fl = cb * (length - L); + + if (tempfb_fl < fbstar_fl) + return fbstar_fl; + else + return tempfb_fl; +} + +// function to calculae bending spring force (taken from Choi & Co) +BLI_INLINE float fbstar_jacobi(float length, float L, float kb, float cb) +{ + float tempfb_fl = kb * fb(length, L); + float fbstar_fl = cb * (length - L); + + if (tempfb_fl < fbstar_fl) { + return cb; + } + else { + return kb * fbderiv(length, L); + } } static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, const lVector &X, const lVector &V, float time) { - const float structural_scale = 0.001f; + const float structural_scale = 1.0f; Cloth *cloth = clmd->clothObject; ClothVertex *verts = cloth->verts; @@ -378,10 +395,6 @@ static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, con float L = s->restlen; float cb; /* = clmd->sim_parms->structural; */ /*UNUSED*/ - float stretch_force[3] = {0, 0, 0}; - float bending_force[3] = {0, 0, 0}; - float nulldfdx[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; - float scaling = 0.0; int no_compress = clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS; @@ -392,8 +405,8 @@ static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, con 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; +// 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)); @@ -422,11 +435,13 @@ static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, con if (ELEM(s->type, CLOTH_SPRING_TYPE_STRUCTURAL, CLOTH_SPRING_TYPE_SHEAR, CLOTH_SPRING_TYPE_SEWING)) { #ifdef CLOTH_FORCE_SPRING_STRUCTURAL if (length > L || no_compress) { + float stretch_force[3] = {0, 0, 0}; + s->flags |= CLOTH_SPRING_FLAG_NEEDED; k = clmd->sim_parms->structural * structural_scale; scaling = k + s->stiffness * fabsf(clmd->sim_parms->max_struct - k); - + k = scaling / (clmd->sim_parms->avg_spring_len + FLT_EPSILON); // TODO: verify, half verified (couldn't see error) if (s->type & CLOTH_SPRING_TYPE_SEWING) { @@ -495,11 +510,11 @@ static void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, con scaling = k + s->stiffness * fabsf(clmd->sim_parms->max_bend - k); cb = k = scaling / (20.0f * (clmd->sim_parms->avg_spring_len + FLT_EPSILON)); - - mul_fvector_S(bending_force, dir, fbstar(length, L, k, cb)); - VECADD(s->f, s->f, bending_force); - - dfdx_spring_type2(s->dfdx, dir, length, L, k, cb); + + madd_v3_v3fl(s->f, dir, -fbstar(length, L, k, cb)); + + outerproduct(s->dfdx, dir, dir); + mul_m3_fl(s->dfdx, -fbstar_jacobi(length, L, k, cb)); } #endif } @@ -515,16 +530,21 @@ static void cloth_apply_spring_force(ClothModifierData *clmd, ClothSpring *s, lV return; if (!(s->type & CLOTH_SPRING_TYPE_BENDING)) { + lMatrix_add_m3(dFdV, s->dfdv, s->ij, s->ij); + lMatrix_add_m3(dFdV, s->dfdv, s->kl, s->kl); lMatrix_sub_m3(dFdV, s->dfdv, s->ij, s->kl); + lMatrix_sub_m3(dFdV, s->dfdv, s->kl, s->ij); } add_v3_v3(lVector_v3(F, s->ij), s->f); if (!(s->type & CLOTH_SPRING_TYPE_GOAL)) { sub_v3_v3(lVector_v3(F, s->kl), s->f); - } + lMatrix_add_m3(dFdX, s->dfdx, s->ij, s->ij); + lMatrix_add_m3(dFdX, s->dfdx, s->kl, s->kl); lMatrix_sub_m3(dFdX, s->dfdx, s->ij, s->kl); + lMatrix_sub_m3(dFdX, s->dfdx, s->kl, s->ij); } 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) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs