/// <summary> /// Builds the chain of Bodies with joints and add this chain into World. /// </summary> /// <param name="position">Direction and position of first chain member.</param> /// <param name="boxLength">Chain member (rectangle) length</param> /// <param name="boxWidth">Chain member (rectangle) height</param> /// <param name="boxMass">Chain member mass</param> /// <param name="spacing">Distance between chain members</param> /// <param name="length">The chain length</param> /// <param name="modelId">Id of the parent Model entity</param> /// <returns>The list of Bodies created</returns> public static IList <BaseModelBody> BuildChain(Vector2D position, Scalar boxLength, Scalar boxWidth, Scalar boxMass, Scalar spacing, Scalar length, Guid modelId) { var bodies = new List <BaseModelBody>(); ChainMember last = null; for (Scalar x = 0; x < length; x += boxLength + spacing, position.X += boxLength + spacing) { var current = ChainMember.Create(CreateRectangle(boxWidth, boxLength, boxMass, new ALVector2D(0, position)), modelId); Will.Instance.AddBody(current); if (last != null) { var anchor = (current.State.Position.Linear + last.State.Position.Linear) * .5f; var joint = new HingeJoint(last, current, anchor, new Lifespan()) { DistanceTolerance = 50, Softness = 0.005f }; last.EndJoint = current.BegJoint = joint; Will.Instance.AddJoint(joint); } bodies.Add(current); last = current; } return(bodies); }