Example #1
0
int OBBIntTool::computeIntersection(OBB & box0, OBB & box1,SReal alarmDist,SReal contactDist,OutputVector* contacts){
//    OBB::Real r02 = box0.extent(0)* box0.extent(0) + box0.extent(1)* box0.extent(1) + box0.extent(2)* box0.extent(2);
//    OBB::Real r12 = box1.extent(0)* box1.extent(0) + box1.extent(1)* box1.extent(1) + box1.extent(2)* box1.extent(2);
//    OBB::Real r0 = helper::rsqrt(r02);
//    OBB::Real r1 = helper::rsqrt(r12);
//    if((box0.center() - box1.center()).norm2() > r02 + 2*r0*r1 + r12){
//        return 0;
//    }
    IntrOBBOBB intr(box0,box1);
    //SReal max_time = helper::rsqrt((alarmDist * alarmDist)/((box1.lvelocity() - box0.lvelocity()).norm2()));
    if(/*intr.Find(max_time,box0.lvelocity(),box1.lvelocity())*/intr.Find(alarmDist)){
        Vector3 P0P1(intr.pointOnSecond() - intr.pointOnFirst());
        OBB::Real dist2 = P0P1.norm2();
        if((!intr.colliding()) && dist2 > alarmDist * alarmDist)
            return 0;        

        assert((!intr.colliding()) || (P0P1.cross(intr.separatingAxis()).norm2() < IntrUtil<SReal>::ZERO_TOLERANCE()));

        contacts->resize(contacts->size()+1);
        DetectionOutput *detection = &*(contacts->end()-1);

        if((P0P1.cross(intr.separatingAxis()).norm2() < IntrUtil<SReal>::ZERO_TOLERANCE())){
            detection->normal = intr.separatingAxis();//separatingAxis is normalized while P0P1 is not
        }
        else{
            detection->normal = P0P1;
            detection->normal.normalize();
        }

        detection->point[0] = intr.pointOnFirst();
        detection->point[1] = intr.pointOnSecond();

        if(intr.colliding())
            detection->value = -helper::rsqrt(dist2) - contactDist;
        else
            detection->value = helper::rsqrt(dist2) - contactDist;

        detection->elem.first = box0;
        detection->elem.second = box1;
        detection->id = (box0.getCollisionModel()->getSize() > box1.getCollisionModel()->getSize()) ? box0.getIndex() : box1.getIndex();

        return 1;
    }

    return 0;
}