public void TestResolveVelocityWithAcceleration()
        {
            var p = new Particle
            {
                Position = new Vector2D(0, 0),
                Velocity = new Vector2D(1, 0),
                Mass     = 1
            };

            p.AddForce(new Vector2D(1, 0));
            p.Update(1);

            var contact         = new ParticleContact(p, null, 1, 0, new Vector2D(-1, 0));
            var resolveVelocity = new PrivateObject(contact);

            resolveVelocity.Invoke("ResolveVelocity", 1);

            Assert.AreEqual(new Vector2D(-1, 0), p.Velocity, "物体获得补偿速度");

            p.AddForce(new Vector2D(1, 0));
            p.Update(1);
            Assert.AreEqual(new Vector2D(0, 0), p.Velocity, "物体保持静止");

            p.AddForce(new Vector2D(-1, 0));
            resolveVelocity.Invoke("ResolveVelocity", 1);
            Assert.AreEqual(new Vector2D(0, 0), p.Velocity, "物体不会获得补偿速度");
        }
Exemple #2
0
    // Update is called once per frame
    void Update()
    {
        particle = gameObject.GetComponent <MyPhysics> ().particle;
        float mass    = particle.mass;
        float gravity = particle.mass;

        if (Input.GetKey(KeyCode.S))
        {
            particle.AddForce(new Vector3(-100, 0, 0));
        }
        if (Input.GetKey(KeyCode.D))
        {
            particle.AddForce(new Vector3(0, 0, -100));
        }
        if (Input.GetKey(KeyCode.W))
        {
            particle.AddForce(new Vector3(100, 0, 0));
        }
        if (Input.GetKey(KeyCode.A))
        {
            particle.AddForce(new Vector3(0, 0, 100));
        }
        if (Input.GetKey(KeyCode.F))
        {
            float flyforce = mass * gravity * 1.5f;
            particle.AddForce(new Vector3(0, flyforce, 0));
        }
        if (Input.GetKeyDown(KeyCode.Space))
        {
            RestartGame();
        }
    }
Exemple #3
0
 public override void UpdateForce(Particle particle, float duaration)
 {
     float depth = particle.Position.Y;
     if (depth >= WaterHeight + MaxDepth) return;
     Vector3 force = new Vector3();
     if (depth <= WaterHeight - MaxDepth)
     {
         force.Y = LiquidDensity * Volume;
         particle.AddForce(force);
         return;
     }
     // Otherwise we are partly submerged.
     force.Y = LiquidDensity * Volume * (depth - MaxDepth - WaterHeight) / 2 * MaxDepth;
     particle.AddForce(force);
 }
    // Update is called once per frame
    public void Update()
    {
        Vector3 v1       = r1.v;
        Vector3 v2       = r2.v;
        Vector3 v3       = r3.v;
        var     vAir     = -p;
        var     vSurface = (v1 + v2 + v3) / 3;

        v = vSurface - vAir;

        var particlePos = Vector3.Cross((r2.r - r1.r), (r3.r - r1.r));

        //Normal of a triangle
        var n = particlePos / particlePos.magnitude;

        //Area of a triangle
        var aO = .5f * Vector3.Cross((r2.r - r1.r), (r3.r - r1.r)).magnitude;
        var a  = aO + (Vector3.Dot(v, n) / v.magnitude);

        //Calculating the aerodynamic force
        var nPrime     = particlePos;
        var totalForce = -.5f * (((v.magnitude * Vector3.Dot(v, nPrime)) / (2 * nPrime.magnitude)) * nPrime);

        r1.AddForce(totalForce);
        r2.AddForce(totalForce);
        r3.AddForce(totalForce);
    }
Exemple #5
0
        private void UpdateForce(Particle particle, Particle other)
        {
            if (particle.HasInfiniteMass)
            {
                return;
            }

            // Calculate the vector of the spring
            Vector3d force = particle.Position - other.Position;

            // Calculate the magnitude of the force
            double magnitude = force.Magnitude;

            if (magnitude <= m_restLength)
            {
                return;
            }

            // Calculate the magnitude of the force
            magnitude = (m_restLength - magnitude) * m_springConstant;

            // Calculate the final force and apply it
            force.Normalize();
            force *= magnitude;
            particle.AddForce(force);
        }
Exemple #6
0
 public override void UpdateForce(Particle particle, float duaration)
 {
     Vector3 force = particle.Velocity;
     float dragcoef = force.Magnitude;
     dragcoef = K1 * dragcoef * K2 * dragcoef * dragcoef;
     force.Normalize();
     force *= -dragcoef;
     particle.AddForce(force);
 }
Exemple #7
0
 private void addGroundForce(Particle proj, double timeIncrement)
 {
     if (LockGround)
     {
         proj.Velocity = new Vector(0, 0, 0);
         proj.Position = new Vector(proj.Position.X, proj.Position.Y, 0);
         proj.AddForce(-proj.Forces);
     }
     else
     {
         proj.Velocity = new Vector(proj.Velocity.X, proj.Velocity.Y, 0);
         proj.Position = new Vector(proj.Position.X, proj.Position.Y, 0);
         double forceZ = proj.Forces.Z;
         if (forceZ < 0)
         {
             proj.AddForce(new Vector(0, 0, -forceZ));
         }
     }
 }
        public override void ApplyTo(Particle particle, double duration)
        {
            // 质量无限大的物体不受重力影响
            if (particle.InverseMass == 0)
            {
                return;
            }

            // 施加重力
            particle.AddForce(this.gravity * particle.Mass);
        }
        public override void ApplyTo(Particle particle, double duration)
        {
            foreach (var item in this.linked)
            {
                var d = particle.Position - item.Position;

                double force = (this.length - d.Length()) * this.k;
                d.Normalize();
                particle.AddForce(d * force);
            }
        }
Exemple #10
0
 public override void UpdateForce(Particle particle, float duaration)
 {
     Vector3 force = particle.Position;
     force -= Other.Position;
     float magnit = force.Magnitude;
     magnit = MathHelper.Abs(magnit - RestLength);
     magnit *= SpringConstant;
     force.Normalize();
     force *= -magnit;
     particle.AddForce(force);
 }
Exemple #11
0
        public override void UpdateForce(Particle particle, double dt)
        {
            // Check that we do not have infinite mass
            if (!particle.HasFiniteMass)
            {
                return;
            }

            // Apply the mass-scaled force to the particle
            particle.AddForce(m_gravity * particle.GetMass());
        }
Exemple #12
0
 public override void UpdateForce(Particle particle, float duaration)
 {
     Vector3 force = particle.Position;
     force -= Other.Position;
     float magnitude = force.Magnitude;
     if (magnitude <= RestLength) return;
     magnitude = SpringConstant * (RestLength - magnitude);
     force.Normalize();
     force *= -magnitude;
     particle.AddForce(force);
 }
Exemple #13
0
        public void Integrate_IfTheMassOfTheParticleIsInfinite_ForcesOtherThanGravityHaveNoEffect()
        {
            var particleNoForces = new Particle();
            var particleForces   = new Particle();

            particleForces.AddForce(new Vector3(3.0, 4.0, 5.0));

            particleNoForces.Integrate(1.0);
            particleForces.Integrate(1.0);

            Assert.IsTrue(particleForces.Position.Equals(particleNoForces.Position));
        }
Exemple #14
0
 private void FixedUpdate()
 {
     if (gameManager.controlMode == GameManager.ControlMode.springControl)
     {
         Vector3 accVector = new Vector3();
         accVector += new Vector3(0, gameManager.gravity, 0);
         throwableParticle.AddForce(accVector.x, accVector.y, accVector.z);
         throwableParticle.Integrate(Time.fixedDeltaTime);
         boundingRectangle.center = throwableParticle.GetPosition();
         transform.position       = throwableParticle.GetPosition().CycloneToUnity();
     }
 }
Exemple #15
0
    void Update()
    {
        particle = gameObject.GetComponent <MyPhysics> ().particle;
        float mass    = particle.mass;
        float gravity = particle.mass;

        if (Input.GetKey(KeyCode.A))
        {
            particle.AddForce(new Vector3(-80, 0, 0));
        }
        if (Input.GetKey(KeyCode.S))
        {
            particle.AddForce(new Vector3(0, 0, -80));
        }
        if (Input.GetKey(KeyCode.D))
        {
            particle.AddForce(new Vector3(80, 0, 0));
        }
        if (Input.GetKey(KeyCode.W))
        {
            particle.AddForce(new Vector3(0, 0, 80));
        }
        if (Input.GetKey(KeyCode.F))
        {
            float flyforce = mass * gravity * 1.5f;
            particle.AddForce(new Vector3(0, flyforce, 0));
        }
        if (Input.GetKeyDown(KeyCode.Space))
        {
            RestartGame();
        }
        if (Input.GetKeyDown(KeyCode.G))
        {
            gethitClone = GameObject.Instantiate(gethit);
        }

        Vector3 direction = particle.forceAccum.normalized * 5;

        Debug.DrawRay(transform.position, direction, Color.cyan);
    }
Exemple #16
0
        public override void ApplyTo(Particle particle, double duration)
        {
            if (particle.Velocity == Vector2D.Zero)
            {
                return;
            }

            double c = particle.Velocity.Length();

            c = this.k1 * c + this.k2 * c * c;

            particle.AddForce(particle.Velocity.Normalize() * -c);
        }
Exemple #17
0
    private void OnTriggerStay(Collider other)
    {
        Debug.Log(other.name);
        Particle s = other.GetComponent <Particle>();

        if (s != null)
        {
            if (s.force.y < float.Epsilon)                              //운동 방향을 가짜로 표현, 떨어지고 있는 경우에만 충돌
            {
                s.AddForce(new Vector3(0.0f, s.force.y * -1.9f, 0.0f)); //마찰을 가짜로 표현
            }
        }
    }
    public void ApplySpringForce(Particle particle, Vector3 mouseUpVector)
    {
        Vector3 force = new Vector3();

        force = particle.GetPosition() - mouseUpVector;
        float magnitude = force.Magnitude();

        magnitude  = Mathf.Abs(magnitude - restLength);
        magnitude *= springConstant;
        force.Normalize();
        force *= magnitude;
        force *= forceCoeff;
        particle.AddForce(force.x, force.y, force.z);
    }
Exemple #19
0
        public override void UpdateForce(Particle particle, double dt)
        {
            Vector3d force = particle.Velocity;

            // Calculate the total drag coefficient
            double dragCoeff = force.Magnitude;

            dragCoeff = k1 * dragCoeff + k2 * dragCoeff * dragCoeff;

            // Calculate the final force and apply it
            force.Normalize();
            force *= -dragCoeff;
            particle.AddForce(force);
        }
Exemple #20
0
        public void Integrate_CanAddForcesTogether_AndWithCombinedForcesAddedToGravity_WhenIntegrating_ParticlesVelocityIsUpdated()
        {
            var particleNoForces   = new Particle(Vector3.ZeroVector, Vector3.ZeroVector, 0.5);
            var particleWithForces = new Particle(Vector3.ZeroVector, Vector3.ZeroVector, 0.5);

            for (var i = 0; i < 5; i++)
            {
                particleWithForces.AddForce(new Vector3(0.5, 1.0, 1.5));
            }

            particleNoForces.Integrate(1.0);
            particleWithForces.Integrate(1.0);

            Assert.IsTrue(particleNoForces.Velocity.Equals(new Vector3(0.0, -10.0, 0.0)));
            Assert.IsTrue(particleWithForces.Velocity.Equals(new Vector3(1.25, -7.5, 3.75)));
        }
Exemple #21
0
 public override void UpdateForce(Particle particle, float duration)
 {
     if (!(particle.Mass > 0.0f)) return;
     Vector3 position = particle.Position;
     position -= Anchor;
     float gamma = 0.5f * MathHelper.Sqrt((4 * SpringConstant - Damping * Damping));
     if (gamma == 0.0f) return;
     Vector3 c = position * (Damping / (2.0f * gamma)) +
     particle.Velocity * (1.0f / gamma);
     Vector3 target = position * MathHelper.Cos(gamma * duration) +
     c * MathHelper.Sin(gamma * duration);
     target *= MathHelper.Exp(-0.5f * duration * Damping);
     Vector3 accel = (target - position) * (1.0f / duration * duration) -
     particle.Velocity * duration;
     particle.AddForce(accel * particle.Mass);
 }
Exemple #22
0
 public override void ApplyTo(Particle particle, double duration)
 {
     for (int i = _linked.Count - 1; i >= 0; i--)
     {
         if (_linked[i].IsValid)
         {
             var d = particle.Position - _linked[i].Particle.Position;
             if (d.Length() / _length > _lengthFactor)
             {
                 _linked[i].IsValid = false;
                 continue;
             }
             double force = (_length - d.Length()) * _k;
             particle.AddForce(d.Normalize() * force);
         }
     }
 }
Exemple #23
0
    public void Update()
    {
        //Moving the Particle
        var ePrime = pTwo.r - pOne.r;
        var eMag   = ePrime.magnitude;
        var e      = ePrime / eMag;
        //e.Normalize();

        var v1 = Vector3.Dot(e, pOne.v);
        var v2 = Vector3.Dot(e, pTwo.v);

        var Fsd = (-Ks * (Lo - eMag)) - (Kd * (v1 - v2));
        var F1  = Fsd * e;
        var F2  = -F1;

        pOne.AddForce(F1);
        pTwo.AddForce(F2);
    }
        public void TestUpdate()
        {
            Particle obj = new Particle
            {
                Mass     = 1,
                Position = new Vector2D(0, 0)
            };

            obj.AddForce(new Vector2D(1, 0));

            obj.Update(1);
            Assert.AreEqual(new Vector2D(0, 0), obj.Position);
            Assert.AreEqual(new Vector2D(1, 0), obj.Velocity);
            Assert.AreEqual(new Vector2D(1, 0), obj.Acceleration);

            obj.Update(1);
            obj.Update(1);
            Assert.AreEqual(new Vector2D(2, 0), obj.Position);
            Assert.AreEqual(new Vector2D(1, 0), obj.Velocity);
            Assert.AreEqual(new Vector2D(0, 0), obj.Acceleration);
        }
        public void Update()
        {
            //calculate the average velocity of the particles
            var AverageVelocity = (AreoPart1.Velocity + AreoPart2.Velocity + AreoPart3.Velocity) / 3;
            var V = AverageVelocity - density;

            //calculate the normal of the triangle
            var diffofAeroPart2andAreoPart1 = AreoPart2.Position - AreoPart1.Position;
            var diffofAreoPart3andAreoPart1 = AreoPart3.Position - AreoPart1.Position;
            var cross = Vector3.Cross(diffofAeroPart2andAreoPart1, diffofAreoPart3andAreoPart1);

            var n = cross / cross.magnitude;

            //calculate the area of the triangle
            var ao = cross.magnitude / 2;
            var a  = ao + (Vector3.Dot(V, n) / V.magnitude);

            //calculate the total force being applied
            var force = -.5f * ((V.magnitude * Vector3.Dot(V, cross)) / (3 * cross.magnitude)) * cross.normalized;

            AreoPart1.AddForce(force / 4);
            AreoPart2.AddForce(force / 4);
            AreoPart3.AddForce(force / 4);
        }
    public void Update()
    {
        //calculate the average velocity of the particles
        var Vs = (r1.Velocity + r2.Velocity + r3.Velocity) / 3;
        var V  = Vs - aeroForce;

        //calculate the normal of the triangle
        var diffofR2andR1 = r2.Position - r1.Position;
        var diffofR3andR1 = r3.Position - r1.Position;
        var cross         = Vector3.Cross(diffofR2andR1, diffofR3andR1);

        var n = cross / cross.magnitude;

        //calculate the area of the triangle
        var ao = cross.magnitude / 2;
        var a  = ao + (Vector3.Dot(V, n) / V.magnitude);

        //calculate the total force being applied
        var force = -.5f * ((V.magnitude * Vector3.Dot(V, cross)) / (2 * cross.magnitude)) * cross.normalized;

        r1.AddForce(force / 3);
        r2.AddForce(force / 3);
        r3.AddForce(force / 3);
    }
Exemple #27
0
		public void Integrate_IfTheMassOfTheParticleIsInfinite_ForcesOtherThanGravityHaveNoEffect()
		{
			var particleNoForces = new Particle();
			var particleForces = new Particle();

			particleForces.AddForce(new Vector3(3.0, 4.0, 5.0));

			particleNoForces.Integrate(1.0);
			particleForces.Integrate(1.0);

			Assert.IsTrue(particleForces.Position.Equals(particleNoForces.Position));
		}
Exemple #28
0
		public void Integrate_CanAddForcesTogether_AndWithCombinedForcesAddedToGravity_WhenIntegrating_ParticlesVelocityIsUpdated()
		{
			var particleNoForces = new Particle(Vector3.ZeroVector, Vector3.ZeroVector, 0.5);
			var particleWithForces = new Particle(Vector3.ZeroVector, Vector3.ZeroVector, 0.5);

			for (var i = 0; i < 5; i++)
			{
				particleWithForces.AddForce(new Vector3(0.5, 1.0, 1.5));
			}

			particleNoForces.Integrate(1.0);
			particleWithForces.Integrate(1.0);

			Assert.IsTrue(particleNoForces.Velocity.Equals(new Vector3(0.0, -10.0, 0.0)));
			Assert.IsTrue(particleWithForces.Velocity.Equals(new Vector3(1.25, -7.5, 3.75)));
		}
 public override void ApplyTo(Particle particle, double duration)
 {
     particle.AddForce(_force);
 }