/// <summary> /// Aplica la fuerza del amortiguador al objeto especificado /// </summary> /// <param name="obj">Objeto</param> /// <param name="duration">Duración</param> public override void UpdateForce(ref IPhysicObject obj, float duration) { // Obtener el cuerpo del objeto CollisionPrimitive primitive = obj.Primitive; if (primitive != null) { // Calculate the two ends in world space Vector3 lws = primitive.GetPointInWorldSpace(m_ConnectionPoint); Vector3 ows = m_Other.GetPointInWorldSpace(m_OtherConnectionPoint); // Calculate the vector of the spring Vector3 force = lws - ows; // Calculate the magnitude of the force float magnitude = force.Length(); magnitude = Math.Abs(magnitude - m_RestLength); magnitude *= m_SpringConstant; // Calculate the final force and apply it force.Normalize(); force *= -magnitude; primitive.AddForceAtPoint(force, lws); } }
/// <summary> /// Añade los contactos necesarios para mantener unidos mediante la barra a los cuerpos /// </summary> /// <param name="contactData">Datos de colisión</param> /// <param name="limit">Límite de contactos a añadir</param> /// <returns>Devuelve el número de contacos añadidos</returns> /// <remarks>Sólo añade un contacto o ninguno</remarks> public override int AddContact(ref CollisionData contactData, int limit) { if (contactData.HasMoreContacts()) { // Encontrar la longitud actual Vector3 positionOneWorld = m_BodyOne.GetPointInWorldSpace(m_PositionOne); Vector3 positionTwoWorld = m_BodyTwo.GetPointInWorldSpace(m_PositionTwo); float currentLen = Vector3.Distance(positionOneWorld, positionTwoWorld); // Comprobar si estamos en extensión correcta if (currentLen == m_Length) { return(0); } // Rellenar el contacto Contact contact = contactData.CurrentContact; contact.Bodies[0] = m_BodyOne; contact.Bodies[1] = m_BodyTwo; contact.ContactPoint = (positionOneWorld + positionTwoWorld) * 0.5f; // Calcular la normal Vector3 normal = Vector3.Normalize(m_BodyTwo.Position - m_BodyOne.Position); // La normal de contacto depende de si hay que extender o contraer para conservar la longitud if (currentLen > m_Length) { contact.ContactNormal = normal; contact.Penetration = currentLen - m_Length; } else { contact.ContactNormal = Vector3.Negate(normal); contact.Penetration = m_Length - currentLen; } // Siempre restitución 0 contact.Restitution = 0f; contactData.AddContact(); return(1); } return(0); }
/// <summary> /// Aplica la fuerza del amortiguador al cuerpo especificado /// </summary> /// <param name="body">Cuerpo</param> /// <param name="duration">Duración</param> public override void UpdateForce(ref RigidBody body, float duration) { // Calculate the two ends in world space Vector3 lws = body.GetPointInWorldSpace(m_ConnectionPoint); Vector3 ows = m_Other.GetPointInWorldSpace(m_OtherConnectionPoint); // Calculate the vector of the spring Vector3 force = lws - ows; // Calculate the magnitude of the force float magnitude = force.Length(); magnitude = Math.Abs(magnitude - m_RestLength); magnitude *= m_SpringConstant; // Calculate the final force and apply it force.Normalize(); force *= -magnitude; body.AddForceAtPoint(force, lws); }