public void ApplyForce(SimObject simObject)
        {
            //get the direction vector
            direction = simObjectA.CurrPosition - simObjectB.CurrPosition;

            //check for zero vector
            if (direction != Vector3.Zero)
            {
                //get length
                currLength = direction.Length();

                //normalize
                direction.Normalize();

                //add spring force
                force = -stiffness * ((currLength - restLength) * direction);

                //add spring damping force
                force += -damping * Vector3.Dot(simObjectA.CurrVelocity - simObjectB.CurrVelocity, direction) * direction;

                //apply the equal and opposite forces to the objects
                simObjectA.ResultantForce += force;
                simObjectB.ResultantForce += -force;
            }
        }
        public override void Integrate(Vector3 acceleration, SimObject simObject)
        {
            //calculate new position using the velocity at current time
            simObject.CurrPosition += simObject.CurrVelocity * fixedTimeStep;

            //calculate new velocity using the acceleration at current time
            simObject.CurrVelocity += acceleration * fixedTimeStep;
        }
        public override void Integrate(Vector3 acceleration, SimObject simObject)
        {
            newPosition = (2 - drag) * simObject.CurrPosition
                - (1 - drag) * simObject.PrevPosition
                + acceleration * fixedTimeStep * fixedTimeStep;

            simObject.PrevPosition = simObject.CurrPosition;
            simObject.CurrPosition = newPosition;
        }
 public Spring(float stiffness, float damping, SimObject simObjectA, SimObject simObjectB, float restLength)
     : base()
 {
     this.stiffness = stiffness;
     this.damping = damping;
     this.simObjectA = simObjectA;
     this.simObjectB = simObjectB;
     this.restLength = restLength;
 }
 public void AddSpring(float stiffness, float damping, SimObject simObjA, SimObject simObjB)
 {
     Spring spring = new Spring(stiffness, damping, simObjA, simObjB);
     springs.Add(spring);
 }
 public void AddSimObject(SimObject simObject)
 {
     simObjects.Add(simObject);
 }
 //------------------------------------------------------------
 public LengthConstraint(float length, SimObject simObj1, SimObject simObj2)
 {
     this.length = length;
     this.simObj1 = simObj1;
     this.simObj2 = simObj2;
 }
 public void ApplyForce(SimObject simObject)
 {
     simObject.ResultantForce += simObject.Mass * acceleration;
 }
 public abstract void Integrate(Vector3 acceleration, SimObject simObject);
 public void ApplyForce(SimObject simObject)
 {
     simObject.ResultantForce += - dragCoefficient * simObject.CurrVelocity;
 }
 //------------------------------------------------------
 public PointConstraint(Vector3 point, SimObject simObject)
 {
     this.point = point;
     this.simObject = simObject;
 }
 //-----------------------------------------------------------
 public Spring(float stiffness, float damping, SimObject simObjectA, SimObject simObjectB)
     : this(stiffness, damping, simObjectA, simObjectB, (simObjectA.CurrPosition - simObjectB.CurrPosition).Length())
 {
 }