示例#1
0
    private void ResolveVelocity(CollisionHull2D.Collision collision)
    {
        // we are either separating or stationary
        // no collision needs to be resolved
        if (collision.closingVelocity > 0)
        {
            return;
        }

        CollisionHull2D.Collision.Contact[] contacts = collision.contact;
        float totalInverseMass = collision.a.particle.massInv + collision.b.particle.massInv;

        // both objects have infinite mass
        if (totalInverseMass <= 0)
        {
            return;
        }

        for (int i = 0; i < collision.contactCount; ++i)
        {
            CollisionHull2D.Collision.Contact contact = contacts[i];
            float   realSeparating  = -collision.closingVelocity * contact.restitution;
            float   deltaVelocity   = realSeparating - collision.closingVelocity;
            float   impulse         = deltaVelocity / totalInverseMass;
            Vector2 impulsePerIMass = contact.normal * impulse;
            collision.a.particle.velocity += (impulsePerIMass * collision.a.particle.massInv);
            collision.b.particle.velocity += (impulsePerIMass * -collision.b.particle.massInv);
        }
    }
示例#2
0
    // Start is called before the first frame update
    void Start()
    {
        desc         = new CollisionHull2D.Collision();
        currentScene = SceneManager.GetActiveScene();

        colliders   = new List <CollisionHull2D>();
        rootObjects = new List <GameObject>();
        currentScene.GetRootGameObjects(rootObjects);

        cm = Camera.main;


        findHulls();
    }
示例#3
0
 private void ResolveInterpenetration(CollisionHull2D.Collision collision)
 {
     for (int i = 0; i < collision.contactCount; ++i)
     {
         CollisionHull2D.Collision.Contact contact = collision.contact[i];
         if (contact.penetrationDepth > 0)
         {
             float totalInvMass = collision.a.particle.massInv + collision.b.particle.massInv;
             if (totalInvMass > 0)
             {
                 Vector2 movePerIMass = contact.normal * (contact.penetrationDepth / totalInvMass);
                 collision.a.particle.position += movePerIMass * collision.a.particle.massInv;
                 collision.b.particle.position += movePerIMass * -collision.b.particle.massInv;
             }
         }
     }
 }
示例#4
0
    public void CollisionImpulse(CollisionHull2D.Collision c)
    {
        var index = 0;
        //var relativeVelocity = c.a.getParticle2D().getVelocity();
        //relativeVelocity -= c.b.getParticle2D().getVelocity();
        //var separatingVel = relativeVelocity * c.contacts[index].normal;
        float separatingVel = -c.closingVelocity.magnitude; //

        if (separatingVel < 0)
        {
            // closing velocity modified by restitution
            float newSeperatingVel = -separatingVel * c.contacts[index].restitution;
            // difference between closing velocity*restitution and seperating velocity.
            float deltaVel         = newSeperatingVel - separatingVel;
            float totalInverseMass = c.a.getParticle2D().getInverseMass() + c.b.getParticle2D().getInverseMass();
            float impulse          = deltaVel / totalInverseMass;
            // impulse per unit of mass.
            Vector2 impulsePerIMass = c.contacts[index].normal * impulse;
            Vector2 newVel          = velocity + impulsePerIMass * inverseMass;
            setVelocity(newVel);
            //c.b.getParticle2D().velocity = c.b.getParticle2D().velocity + impulsePerIMass * c.b.getParticle2D().getInverseMass();
        }
    }