Ejemplo n.º 1
0
    //how deep the objects intersect
    private void ResolvePenetration(CollisionHull3D.CollisionInfo colInfo)
    {
        if (colInfo.contacts[0].penetration <= 0.0f)
        {
            return;
        }

        float totalInverseMass = colInfo.RigidBodyA.invMass + colInfo.RigidBodyB.invMass;

        if (totalInverseMass <= 0.0f)
        {
            return;
        }
        Vector3 movePerMass = colInfo.contacts[0].normal * (colInfo.contacts[0].penetration / totalInverseMass);

        colInfo.RigidBodyA.position -= colInfo.RigidBodyA.invMass * movePerMass;
        colInfo.RigidBodyB.position += colInfo.RigidBodyB.invMass * movePerMass;
    }
Ejemplo n.º 2
0
    void ResolvePenetration(CollisionHull3D.CollisionInfo collisionInfo)
    {
        if (collisionInfo.contacts[0].penetration <= 0.0f)
        {
            return;
        }

        float totalInverseMass = collisionInfo.RigidBodyA.GetInverseMass() + collisionInfo.RigidBodyB.GetInverseMass();

        if (totalInverseMass <= 0.0f)
        {
            return;
        }

        Vector3 movePerMass = collisionInfo.contacts[0].normal * (collisionInfo.contacts[0].penetration / totalInverseMass);

        //collisionInfo.RigidBodyA.position -= collisionInfo.RigidBodyA.GetInverseMass() * movePerMass;
        //collisionInfo.RigidBodyB.position += collisionInfo.RigidBodyB.GetInverseMass() * movePerMass;
        Debug.Log(collisionInfo.contacts[0].point);
    }
Ejemplo n.º 3
0
    void ResolveVelocity(CollisionHull3D.CollisionInfo collisionInfo)
    {
        float separatingVelocity = Vector3.Dot(collisionInfo.RelativeVelocity, collisionInfo.contacts[0].normal);

        if (separatingVelocity > 0.0f)
        {
            return;
        }

        const float velLimit              = 1f;
        float       appliedRestitution    = collisionInfo.RelativeVelocity.sqrMagnitude < velLimit * velLimit ? 0.0f : collisionInfo.contacts[0].restitution;
        float       newSeparatingVelocity = -separatingVelocity * appliedRestitution;

        Vector3 accCausedVelocity = collisionInfo.RigidBodyA.acceleration - collisionInfo.RigidBodyB.acceleration;

        float accCausedSepVelocity = Vector3.Dot(accCausedVelocity, collisionInfo.contacts[0].normal) * Time.fixedDeltaTime;

        if (accCausedSepVelocity < 0)
        {
            newSeparatingVelocity += collisionInfo.contacts[0].restitution * accCausedSepVelocity;
            if (newSeparatingVelocity < 0)
            {
                newSeparatingVelocity = 0;
            }
        }

        float deltaVelocity    = newSeparatingVelocity - separatingVelocity;
        float totalInverseMass = collisionInfo.RigidBodyA.GetInverseMass() + collisionInfo.RigidBodyB.GetInverseMass();

        if (totalInverseMass <= 0.0f)
        {
            return;
        }

        float   impulse        = deltaVelocity / totalInverseMass;
        Vector3 impulsePerMass = collisionInfo.contacts[0].normal * impulse;

        collisionInfo.RigidBodyA.velocity -= collisionInfo.RigidBodyA.GetInverseMass() * impulsePerMass;
        collisionInfo.RigidBodyB.velocity += collisionInfo.RigidBodyB.GetInverseMass() * impulsePerMass;
    }
Ejemplo n.º 4
0
    //how the objects forces act upon each other
    void ResolveVelocity(CollisionHull3D.CollisionInfo colInfo)
    {
        float separatingVelocity = Vector3.Dot(colInfo.RelativeVelocity, colInfo.contacts[0].normal);

        if (separatingVelocity > 0.0f)
        {
            return;
        }
        float newSepVelocity = -separatingVelocity * colInfo.contacts[0].restitution;
        //Resting
        Vector3 accCausedVelocity    = colInfo.RigidBodyB.acceleration - colInfo.RigidBodyA.acceleration;
        float   accCausedSepVelocity = Vector3.Dot(accCausedVelocity, colInfo.contacts[0].normal) * Time.fixedDeltaTime;

        if (accCausedSepVelocity < 0)
        {
            newSepVelocity += colInfo.contacts[0].restitution * accCausedSepVelocity;
            if (newSepVelocity < 0)
            {
                newSepVelocity = 0.0f;
            }
        }

        float deltaVelocity    = newSepVelocity - separatingVelocity;
        float totalInverseMass = colInfo.RigidBodyA.invMass + colInfo.RigidBodyB.invMass;

        if (totalInverseMass <= 0.0f)
        {
            //no fx
            return;
        }
        float   impulse        = deltaVelocity / totalInverseMass;
        Vector3 impulsePerMass = colInfo.contacts[0].normal * impulse;

        colInfo.RigidBodyA.velocity -= colInfo.RigidBodyA.invMass * impulsePerMass;
        colInfo.RigidBodyB.velocity += colInfo.RigidBodyB.invMass * impulsePerMass;
    }