All pastes #151010 Raw Edit

Miscellany

public text v1 · immutable
#151010 ·published 2006-08-27 15:59 UTC
rendered paste body
void SpringNetwork::Simulate(float3N &Xnew, float3N &Vnew, float dt, ClothVertex *extforce)
{	
	// Get ready for conjugate gradient iterative solver step.
	// Initialize operands.
		
	int n=X.count;  // all our big vectors are of this size
	float3N temp(n);  // temp to store result of matrix multiply
	float3N B(n);  
	
	dV.Zero();	
	A.Identity();  // build up the big matrix we feed to solver
		
	if(!step) // implicit euler as initial guess for 2-nd order bdf
	{	
		A = M * A;
		A -= (dFdV * dt +  dFdX * (dt*dt)); // A = I - (dFdV * dt +  dFdX * (dt*dt))
		
		temp = dFdX * V;
		B = F * dt + temp * (dt*dt);
		
	}
	else // BDF-2
	{                                           		 
		
		// multiplying the whole equation from left with M
		// idea taken from Baraff[98] who applied this to the implicit euler formula
		
		A = M * A; // M - [...]
		A -= (dFdV * (2.0f*dt/3.0f) + dFdX * ((4.0f*dt*dt)/9.0f)); // A = I - (dFdV * (2*dt/3) +  dFdX * (4*dt*dt/9))
				
		B = (X-Xold) * (1.0f/3.0f); // (X - Xold) * 1/3 	
		
		B += ( (V*8.0f -  Vold*2.0f) * (dt/9.0f)); // + (8*V - 2*Vold)*(dt/9);
		
		B = M * B; 
		
		temp = dFdV * V;  // + ((4*dt*dt)/9)*(F - dFdV*V)
		B += (F - temp) * ((4.0f*dt*dt)/9.0f); 
		
		temp = (X - Xold);  // - (2*dt/9)*dFdV*(X-Xold);
		temp = dFdV*temp;
		B = B - (temp * (2.0f*dt/9.0f)); 	
	}	
	
	PreConjGradientFiltered(dV,A,B,S,z, olddV);	
	
	olddV = dV;
	
	if(!step)
	{	
		Vnew = V + dV;
		Xnew = X + V*dt; 
		
	}
	else
	{
		Xnew = X + dV;
		
		Vnew = Xnew*(3.0f/2.0f) - X*2.0f;
		Vnew = (Vnew + Xold*0.5f);
		Vnew = Vnew * dt;
	}
}