diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c index e9ceac50c54..98f571300b0 100644 --- a/source/blender/blenkernel/intern/implicit.c +++ b/source/blender/blenkernel/intern/implicit.c @@ -2094,10 +2094,12 @@ bool implicit_hair_volume_get_texture_data(Object *UNUSED(ob), ClothModifierData * This is part of the modified CG method suggested by Baraff/Witkin in * "Large Steps in Cloth Simulation" (Siggraph 1998) */ -static void setup_constraint_matrix(ClothModifierData *clmd, ColliderContacts *contacts, int totcolliders, lfVector *V, fmatrix3x3 *S, lfVector *z, float dt) +static void setup_constraint_matrix(ClothModifierData *clmd, ColliderContacts *contacts, int totcolliders, lfVector *X, lfVector *V, fmatrix3x3 *S, lfVector *z, float dt) { - ClothVertex *verts = clmd->clothObject->verts; - int numverts = clmd->clothObject->numverts; + Cloth *cloth = clmd->clothObject; + ClothVertex *verts = cloth->verts; + int numverts = cloth->numverts; + RootTransform *roots = cloth->implicit->root; int i, j, v; for (v = 0; v < numverts; v++) { @@ -2149,6 +2151,17 @@ static void setup_constraint_matrix(ClothModifierData *clmd, ColliderContacts *c } } } + + /* transform to root space */ + for (v = 0; v < numverts; v++) { + float t[3][3]; + copy_m3_m3(t, roots[v].rot); + transpose_m3(t); + mul_m3_m3m3(S[v].m, S[v].m, t); + mul_m3_m3m3(S[v].m, roots[v].rot, S[v].m); + + vel_world_to_root(z[v], X[v], z[v], &roots[v]); + } } static void cloth_calc_force(ClothModifierData *clmd, float UNUSED(frame), lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M) @@ -2493,7 +2506,7 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase * } /* setup vertex constraints for pinned vertices and contacts */ - setup_constraint_matrix(clmd, contacts, totcolliders, id->V, id->S, id->z, dt); + setup_constraint_matrix(clmd, contacts, totcolliders, id->X, id->V, id->S, id->z, dt); // damping velocity for artistic reasons mul_lfvectorS(id->V, id->V, clmd->sim_parms->vel_damping, numverts);