/// <summary> /// Add an internal spring to this body. /// </summary> /// <param name="pointA">point mass on 1st end of the spring</param> /// <param name="pointB">point mass on 2nd end of the spring</param> /// <param name="springK">spring constant</param> /// <param name="damping">spring damping</param> public void addInternalSpring(int pointA, int pointB, float springK, float damping) { float dist = (mPointMasses[pointB].Position - mPointMasses[pointA].Position).magnitude; InternalSpring s = new InternalSpring(pointA, pointB, dist, springK, damping); mSprings.Add(s); }
public override void accumulateInternalForces() { base.accumulateInternalForces(); // internal spring forces. Vector2 force = new Vector2(); for (int i = 0; i < mSprings.Count; i++) { InternalSpring s = mSprings[i]; VectorTools.calculateSpringForce(ref mPointMasses[s.pointMassA].Position, ref mPointMasses[s.pointMassA].Velocity, ref mPointMasses[s.pointMassB].Position, ref mPointMasses[s.pointMassB].Velocity, s.springD, s.springK, s.damping, ref force); mPointMasses[s.pointMassA].Force.x += force.x; mPointMasses[s.pointMassA].Force.y += force.y; mPointMasses[s.pointMassB].Force.x -= force.x; mPointMasses[s.pointMassB].Force.y -= force.y; } // shape matching forces. if (mShapeMatchingOn) { Vector2 p = DerivedPos; mBaseShape.transformVertices(ref p, DerivedAngle, ref mScale, ref mGlobalShape); DerivedPos = p; for (int i = 0; i < mPointMasses.Count; i++) { if (mShapeSpringK > 0) { if (!mKinematic) { VectorTools.calculateSpringForce(ref mPointMasses[i].Position, ref mPointMasses[i].Velocity, ref mGlobalShape[i], ref mPointMasses[i].Velocity, 0.0f, mShapeSpringK, mShapeSpringDamp, ref force); } else { Vector2 kinVel = Vector2.zero; VectorTools.calculateSpringForce(ref mPointMasses[i].Position, ref mPointMasses[i].Velocity, ref mGlobalShape[i], ref kinVel, 0.0f, mShapeSpringK, mShapeSpringDamp, ref force); } mPointMasses[i].Force.x += force.x; mPointMasses[i].Force.y += force.y; } } } }