Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
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);
        }