[Bf-blender-cvs] [85af281] cloth-improvements: Implement angular spring support for dynamic mesh
Luca Rood
noreply at git.blender.org
Fri Jan 6 00:07:01 CET 2017
Commit: 85af281f85ebe24ffddbdf4457bee537b7dd86c0
Author: Luca Rood
Date: Wed Jan 4 21:49:56 2017 -0200
Branches: cloth-improvements
https://developer.blender.org/rB85af281f85ebe24ffddbdf4457bee537b7dd86c0
Implement angular spring support for dynamic mesh
===================================================================
M source/blender/blenkernel/intern/cloth.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 1d4aef2..857400c 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -1044,6 +1044,58 @@ static void cloth_free_errorsprings(Cloth *cloth, LinkNodePair *edgelist)
}
}
+BLI_INLINE float spring_angle(ClothVertex *verts, int i, int j, int *i_a, int *i_b, int len_a, int len_b)
+{
+ float co_i[3], co_j[3], co_a[3], co_b[3];
+ float dir_a[3], dir_b[3];
+ float tmp1[3], tmp2[3], vec_e[3];
+ float sin, cos;
+ float (*array_a)[3] = BLI_array_alloca(array_a, len_a);
+ float (*array_b)[3] = BLI_array_alloca(array_b, len_b);
+ int x;
+
+ /* assign poly vert coords to arrays */
+ for (x = 0; x < len_a; x++) {
+ copy_v3_v3(array_a[x], verts[i_a[x]].xrest);
+ }
+
+ for (x = 0; x < len_b; x++) {
+ copy_v3_v3(array_b[x], verts[i_b[x]].xrest);
+ }
+
+ /* get edge vert coords and poly centroid coords. */
+ copy_v3_v3(co_i, verts[i].xrest);
+ copy_v3_v3(co_j, verts[j].xrest);
+ cent_poly_v3(co_a, array_a, len_a);
+ cent_poly_v3(co_b, array_b, len_b);
+
+ /* find dir for poly a */
+ sub_v3_v3v3(tmp1, co_j, co_a);
+ sub_v3_v3v3(tmp2, co_i, co_a);
+
+ cross_v3_v3v3(dir_a, tmp1, tmp2);
+ normalize_v3(dir_a);
+
+ /* find dir for poly b */
+ sub_v3_v3v3(tmp1, co_i, co_b);
+ sub_v3_v3v3(tmp2, co_j, co_b);
+
+ cross_v3_v3v3(dir_b, tmp1, tmp2);
+ normalize_v3(dir_b);
+
+ /* find parallel and perpendicular directions to edge */
+ sub_v3_v3v3(vec_e, co_i, co_j);
+ normalize_v3(vec_e);
+
+ /* calculate angle between polys */
+ cos = dot_v3v3(dir_a, dir_b);
+
+ cross_v3_v3v3(tmp1, dir_a, dir_b);
+ sin = dot_v3v3(tmp1, vec_e);
+
+ return atan2(sin, cos);
+}
+
static void cloth_hair_update_bending_targets(ClothModifierData *clmd)
{
Cloth *cloth = clmd->clothObject;
@@ -1258,12 +1310,18 @@ static void cloth_update_spring_lengths( ClothModifierData *clmd, DerivedMesh *d
ClothSpring *spring = search->link;
if ( spring->type != CLOTH_SPRING_TYPE_SEWING ) {
- if ( spring->type & (CLOTH_SPRING_TYPE_STRUCTURAL | CLOTH_SPRING_TYPE_SHEAR | CLOTH_SPRING_TYPE_BENDING) )
+ if ( spring->type & (CLOTH_SPRING_TYPE_STRUCTURAL | CLOTH_SPRING_TYPE_SHEAR | CLOTH_SPRING_TYPE_BENDING) ) {
shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
- else
+ }
+ else {
shrink_factor = 1.0f;
+ }
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
+
+ if ( spring->type == CLOTH_SPRING_TYPE_BENDING ) {
+ spring->restang = spring_angle(cloth->verts, spring->ij, spring->kl, spring->pa, spring->pb, spring->la, spring->lb);
+ }
}
if ( spring->type == CLOTH_SPRING_TYPE_STRUCTURAL ) {
@@ -1276,12 +1334,14 @@ static void cloth_update_spring_lengths( ClothModifierData *clmd, DerivedMesh *d
search = search->next;
}
- if (struct_springs > 0)
+ if (struct_springs > 0) {
clmd->sim_parms->avg_spring_len /= struct_springs;
+ }
for (i = 0; i < mvert_num; i++) {
- if (cloth->verts[i].spring_count > 0)
+ if (cloth->verts[i].spring_count > 0) {
cloth->verts[i].avg_spring_len = cloth->verts[i].avg_spring_len * 0.49f / ((float)cloth->verts[i].spring_count);
+ }
}
}
@@ -1320,58 +1380,6 @@ void cloth_parallel_transport_hair_frame(float mat[3][3], const float dir_old[3]
mul_m3_m3m3(mat, rot, mat);
}
-BLI_INLINE float spring_angle(ClothVertex *verts, int i, int j, int *i_a, int *i_b, int len_a, int len_b)
-{
- float co_i[3], co_j[3], co_a[3], co_b[3];
- float dir_a[3], dir_b[3];
- float tmp1[3], tmp2[3], vec_e[3];
- float sin, cos;
- float (*array_a)[3] = BLI_array_alloca(array_a, len_a);
- float (*array_b)[3] = BLI_array_alloca(array_b, len_b);
- int x;
-
- /* assign poly vert coords to arrays */
- for (x = 0; x < len_a; x++) {
- copy_v3_v3(array_a[x], verts[i_a[x]].xrest);
- }
-
- for (x = 0; x < len_b; x++) {
- copy_v3_v3(array_b[x], verts[i_b[x]].xrest);
- }
-
- /* get edge vert coords and poly centroid coords. */
- copy_v3_v3(co_i, verts[i].xrest);
- copy_v3_v3(co_j, verts[j].xrest);
- cent_poly_v3(co_a, array_a, len_a);
- cent_poly_v3(co_b, array_b, len_b);
-
- /* find dir for poly a */
- sub_v3_v3v3(tmp1, co_j, co_a);
- sub_v3_v3v3(tmp2, co_i, co_a);
-
- cross_v3_v3v3(dir_a, tmp1, tmp2);
- normalize_v3(dir_a);
-
- /* find dir for poly b */
- sub_v3_v3v3(tmp1, co_i, co_b);
- sub_v3_v3v3(tmp2, co_j, co_b);
-
- cross_v3_v3v3(dir_b, tmp1, tmp2);
- normalize_v3(dir_b);
-
- /* find parallel and perpendicular directions to edge */
- sub_v3_v3v3(vec_e, co_i, co_j);
- normalize_v3(vec_e);
-
- /* calculate angle between polys */
- cos = dot_v3v3(dir_a, dir_b);
-
- cross_v3_v3v3(tmp1, dir_a, dir_b);
- sin = dot_v3v3(tmp1, vec_e);
-
- return atan2(sin, cos);
-}
-
/* add a shear and a bend spring between two verts within a poly */
BLI_INLINE bool add_shear_bend_spring(ClothModifierData *clmd, LinkNodePair *edgelist, const MLoop *mloop, const MPoly *mpoly, int i, int j, int k)
{
More information about the Bf-blender-cvs
mailing list