///===================================================== /// 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; }