bool Triangle3D::intersects(const AABB3D& bb) const { //trival accept: contains any point if(bb.contains(a)||bb.contains(b)||bb.contains(c)) return true; //trivial reject: bboxes don't intersect AABB3D tribb; getAABB(tribb); if(!bb.intersects(tribb)) return false; //check for other splitting planes Plane3D p; getPlane(p); if(!p.intersects(bb)) return false; //check planes orthogonal to edge of tri and edge of bb ClosedInterval bbInt,triInt; Vector3 edge; p.offset = Zero; //x dir edge.set(1,0,0); p.normal.setCross(b-a,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; p.normal.setCross(c-b,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; p.normal.setCross(a-c,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; //y dir edge.set(0,1,0); p.normal.setCross(b-a,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; p.normal.setCross(c-b,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; p.normal.setCross(a-c,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; //z dir edge.set(0,0,1); p.normal.setCross(b-a,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; p.normal.setCross(c-b,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; p.normal.setCross(a-c,edge); p.intersects(bb,bbInt.a,bbInt.b); PlaneExtents(*this,p,triInt.a,triInt.b); if(!bbInt.intersects(triInt)) return false; return true; }