public override bool AddContact(PhysicsEngineForFun.ParticleContact contact) { if (CheckParticle == null) { Debug.LogError("Please Assign a value to the variable named checkParticle"); return(false); } Vector3 particlePos = CheckParticle.GetParticlePos(); Vector3 dir = particlePos - PointInPlatform; float dot = Vector3.Dot(dir, Normal); float height = Mathf.Sqrt(dir.sqrMagnitude - dot * dot); if (dot > 0) { if (height > ParticleRadius) { return(false); } contact.contactNormal = Normal.GetPhysicsEngineVector3(); contact.particle0 = CheckParticle; contact.particle1 = null; contact.restitutionCoefficient = 0; contact.penetrationDepth = ParticleRadius - height; return(true); } contact.contactNormal = Normal.GetPhysicsEngineVector3(); contact.particle0 = CheckParticle; contact.particle1 = null; contact.restitutionCoefficient = 0; contact.penetrationDepth = height + ParticleRadius; return(true); }
public override void UpdateForce(PhysicsEngineForFun.Particle particle, float duration) { if (particles == null) { Debug.LogError("Please Assign a value to the variable named particles"); return; } int joinCount = 0; if (particles == null) { Debug.LogError("Please Assign a value to the variable named particles"); return; } foreach (var p in particles) { Vector3 dir = p.GetParticlePos() - particle.GetParticlePos(); float dis = dir.magnitude; if (dis < minNaturalDistance) { float a = dis / minNaturalDistance; particle.AddForce( (dir.normalized * a * maximumForceToPushApart * -1.0f) .GetPhysicsEngineVector3() ); joinCount++; } else if (dis > maxNaturalDistance && dis < maxDistance) { float a = (dis - maxNaturalDistance) / (maxDistance - maxNaturalDistance); particle.AddForce( (dir.normalized * a * maximumForceToPullTogether) .GetPhysicsEngineVector3() ); joinCount++; } if (p == particle && joinCount > 0) { float force = joinCount / particles.Length * maximumForceToFloat; if (force > maximumForceToFloat) { force = maximumForceToFloat; } particle.AddForce(new PhysicsEngineForFun.Vector3(0, force, 0)); } } }