示例#1
0
        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);
        }
示例#2
0
        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));
                }
            }
        }