[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46664] trunk/blender/source/blender/ blenkernel/intern/collision.c: Cloth collisions:

Daniel Genrich daniel.genrich at gmx.net
Tue May 15 15:46:52 CEST 2012


Revision: 46664
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46664
Author:   genscher
Date:     2012-05-15 13:46:50 +0000 (Tue, 15 May 2012)
Log Message:
-----------
Cloth collisions:

Add repulse for near vertices. This code didn't make sense where it was before. Still leaving it also at the old place since it cannot hurt.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/collision.c

Modified: trunk/blender/source/blender/blenkernel/intern/collision.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/collision.c	2012-05-15 13:39:44 UTC (rev 46663)
+++ trunk/blender/source/blender/blenkernel/intern/collision.c	2012-05-15 13:46:50 UTC (rev 46664)
@@ -220,6 +220,12 @@
 	cloth1 = clmd->clothObject;
 
 	for ( ; collpair != collision_end; collpair++ ) {
+		float i1[3], i2[3], i3[3];
+
+		zero_v3(i1);
+		zero_v3(i2);
+		zero_v3(i3);
+
 		// only handle static collisions here
 		if ( collpair->flag & COLLISION_IN_FUTURE )
 			continue;
@@ -260,12 +266,7 @@
 			double impulse = 0.0;
 			float vrel_t_pre[3];
 			float temp[3], spf;
-			float i1[3], i2[3], i3[3];
 
-			zero_v3(i1);
-			zero_v3(i2);
-			zero_v3(i3);
-
 			// calculate tangential velocity
 			copy_v3_v3 ( temp, collpair->normal );
 			mul_v3_fl(temp, magrelVel);
@@ -318,23 +319,47 @@
 				VECADDMUL ( i3, collpair->normal,  impulse );
 			}
 
-			{
-				int i = 0;
+			result = 1;
+		}
+		else
+		{
+			// Apply repulse impulse if distance too short
+			// I_r = -min(dt*kd, m(0, 1d/dt - v_n))
+			float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
 
-				for(i = 0; i < 3; i++)
-				{
-					if(cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[i]) < ABS(i1[i]))
-						cloth1->verts[collpair->ap1].impulse[i] = i1[i];
+			float d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
+			if ( d > ALMOST_ZERO) {
+				// stay on the safe side and clamp repulse
+				float repulse = d*1.0f/spf;
 
-					if(cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[i]) < ABS(i2[i]))
-						cloth1->verts[collpair->ap2].impulse[i] = i2[i];
+				float impulse = repulse / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); // original 2.0 / 0.25
+				VECADDMUL ( i1, collpair->normal,  impulse );
+				VECADDMUL ( i2, collpair->normal,  impulse );
+				VECADDMUL ( i3, collpair->normal,  impulse );
 
-					if(cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[i]) < ABS(i3[i]))
-						cloth1->verts[collpair->ap3].impulse[i] = i3[i];
-				}
+				cloth1->verts[collpair->ap1].impulse_count++;
+				cloth1->verts[collpair->ap2].impulse_count++;
+				cloth1->verts[collpair->ap3].impulse_count++;
+
+				result = 1;
 			}
+		}
 
-			result = 1;
+		if(result)
+		{
+			int i = 0;
+
+			for(i = 0; i < 3; i++)
+			{
+				if(cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[i]) < ABS(i1[i]))
+					cloth1->verts[collpair->ap1].impulse[i] = i1[i];
+
+				if(cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[i]) < ABS(i2[i]))
+					cloth1->verts[collpair->ap2].impulse[i] = i2[i];
+
+				if(cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[i]) < ABS(i3[i]))
+					cloth1->verts[collpair->ap3].impulse[i] = i3[i];
+			}
 		}
 	}
 	return result;




More information about the Bf-blender-cvs mailing list