double MaxMoveOnZclip(const AABB& boxA, const AABB& boxB, double movedist){ //用boxA去撞boxB,别搞反了 (这好像还是句废话) if (!(inXclip(boxA, boxB) && inYclip(boxA, boxB))) return movedist; else if (boxA.zmin >= boxB.zmax && movedist < 0.0) return max(boxB.zmax - boxA.zmin, movedist); else if (boxA.zmax <= boxB.zmin && movedist > 0.0) return min(boxB.zmin - boxA.zmax, movedist); //assert(false); return !stuck ? movedist : 0.0; }
double MaxMoveOnZclip(AABB boxA, AABB boxB, double movedist){ //用boxA去撞boxB,别搞反了 (这好像还是句废话) double ret = 0.0; if (!(inXclip(boxA, boxB) && inYclip(boxA, boxB))){ ret = movedist; } else if (boxA.zmin >= boxB.zmax && movedist < 0.00) { ret = boxB.zmax - boxA.zmin; if (ret<movedist) ret = movedist; } else if (boxA.zmax <= boxB.zmin && movedist > 0.0) { ret = boxB.zmin - boxA.zmax; if (ret > movedist) ret = movedist; } else{ if (!stuck) ret = movedist; else ret = 0.0; } return ret; }
double MaxMoveOnXclip(const AABB& boxA, const AABB& boxB, double movedist){ //用boxA去撞boxB,别搞反了 double ret = 0.0; if (!(inYclip(boxA, boxB) && inZclip(boxA, boxB))){ ret = movedist; } else if (boxA.xmin >= boxB.xmax && movedist < 0.00) { ret = boxB.xmax - boxA.xmin; if (ret<movedist) ret = movedist; } else if (boxA.xmax <= boxB.xmin && movedist > 0.0) { ret = boxB.xmin - boxA.xmax; if (ret > movedist) ret = movedist; } else{ if (!stuck) ret = movedist; else ret = 0.0; } return ret; }
bool Hit(AABB boxA, AABB boxB){ return inXclip(boxA, boxB) && inYclip(boxA, boxB) && inZclip(boxA, boxB); }
bool Hit(const AABB& boxA, const AABB& boxB){ return inXclip(boxA, boxB) && inYclip(boxA, boxB) && inZclip(boxA, boxB); }
double AABB::maxMoveOnXclip(AABB target,double dist){ if (!inYclip(target))return dist; if (xmin>=target.xmax && dist<0.0)return std::min(target.xmax - xmin, dist); if (xmax<=target.xmin && dist>0.0)return std::min(target.xmin - xmax, dist); return dist; }
bool AABB::hitWith(AABB target){ return inXclip(target) && inYclip(target); }