Ejemplo n.º 1
0
///=====================================================
/// Based on: http://web.archive.org/web/20070610223835/http://www.teknikus.dk/tj/gdc2001.htm
///=====================================================
void ClothEmitter::CalculateSpringAcceleration(int particleIndex1, int particleIndex2, float preferredDistance, std::vector<Vec3>& totalParticleAcceleration){
	Particle& particle1 = *m_clothParticles[particleIndex1];
	Particle& particle2 = *m_clothParticles[particleIndex2];

	Vec3 difference = particle1.m_position - particle2.m_position;
	float distance = difference.CalcLength();

	difference = difference / distance;


	//damping
	const Vec3 damping = -m_damping * DotProduct(difference, particle2.m_velocity - particle1.m_velocity) * difference;
	totalParticleAcceleration[particleIndex1] -= damping;
	totalParticleAcceleration[particleIndex2] += damping;


	//spring force
	difference *= m_stiffness * (distance - preferredDistance) / (particle1.m_inverseMass + particle2.m_inverseMass);

	totalParticleAcceleration[particleIndex1] -= difference * particle1.m_inverseMass;
	totalParticleAcceleration[particleIndex2] += difference * particle2.m_inverseMass;
}