CollisionAlgorithmsMatrix.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. #include "anki/collision/CollisionAlgorithmsMatrix.h"
  2. #include "anki/collision/Collision.h"
  3. #include "anki/util/Assert.h"
  4. #include "anki/math/Math.h"
  5. #include <limits>
  6. namespace anki {
  7. //==============================================================================
  8. template<typename T>
  9. bool CollisionAlgorithmsMatrix::tcollide(const CollisionShape& a,
  10. const CollisionShape& b)
  11. {
  12. const T& t = static_cast<const T&>(a);
  13. bool out;
  14. switch(b.getCollisionShapeType())
  15. {
  16. case CollisionShape::CST_LINE_SEG:
  17. out = collide(t, static_cast<const LineSegment&>(b));
  18. case CollisionShape::CST_RAY:
  19. out = collide(t, static_cast<const Ray&>(b));
  20. case CollisionShape::CST_PLANE:
  21. out = collide(t, static_cast<const Plane&>(b));
  22. case CollisionShape::CST_SPHERE:
  23. out = collide(t, static_cast<const Sphere&>(b));
  24. case CollisionShape::CST_AABB:
  25. out = collide(t, static_cast<const Aabb&>(b));
  26. case CollisionShape::CST_OBB:
  27. out = collide(t, static_cast<const Obb&>(b));
  28. case CollisionShape::CST_PERSPECTIVE_CAMERA_FRUSTRUM:
  29. out = collide(t, static_cast<const PerspectiveCameraShape&>(b));
  30. default:
  31. ANKI_ASSERT(0 && "Forgot something");
  32. }
  33. return out;
  34. }
  35. //==============================================================================
  36. bool CollisionAlgorithmsMatrix::collide(const CollisionShape& a,
  37. const CollisionShape& b)
  38. {
  39. bool out;
  40. switch(a.getCollisionShapeType())
  41. {
  42. case CollisionShape::CST_LINE_SEG:
  43. out = tcollide<LineSegment>(a, b);
  44. case CollisionShape::CST_RAY:
  45. out = tcollide<Ray>(a, b);
  46. case CollisionShape::CST_PLANE:
  47. out = tcollide<Plane>(a, b);
  48. case CollisionShape::CST_SPHERE:
  49. out = tcollide<Sphere>(a, b);
  50. case CollisionShape::CST_AABB:
  51. out = tcollide<Aabb>(a, b);
  52. case CollisionShape::CST_OBB:
  53. out = tcollide<Obb>(a, b);
  54. case CollisionShape::CST_PERSPECTIVE_CAMERA_FRUSTRUM:
  55. out = tcollide<PerspectiveCameraShape>(a, b);
  56. default:
  57. ANKI_ASSERT(0 && "Forgot something");
  58. }
  59. return out;
  60. }
  61. //==============================================================================
  62. // 1st row =
  63. //==============================================================================
  64. //==============================================================================
  65. bool CollisionAlgorithmsMatrix::collide(const Ls& /*a*/, const Ls& /*b*/)
  66. {
  67. ANKI_ASSERT(0 && "N/A");
  68. return false;
  69. }
  70. //==============================================================================
  71. bool CollisionAlgorithmsMatrix::collide(const Ls& ls, const Obb& obb)
  72. {
  73. float maxS = std::numeric_limits<float>::min();
  74. float minT = std::numeric_limits<float>::max();
  75. // compute difference vector
  76. Vec3 diff = obb.getCenter() - ls.getOrigin();
  77. // for each axis do
  78. for(int i = 0; i < 3; ++i)
  79. {
  80. // get axis i
  81. Vec3 axis = obb.getRotation().getColumn(i);
  82. // project relative vector onto axis
  83. float e = axis.dot(diff);
  84. float f = ls.getDirection().dot(axis);
  85. // ray is parallel to plane
  86. if(Math::isZero(f))
  87. {
  88. // ray passes by box
  89. if(-e - obb.getExtend()[i] > 0.0 || -e + obb.getExtend()[i] > 0.0)
  90. {
  91. return false;
  92. }
  93. continue;
  94. }
  95. float s = (e - obb.getExtend()[i]) / f;
  96. float t = (e + obb.getExtend()[i]) / f;
  97. // fix order
  98. if(s > t)
  99. {
  100. float temp = s;
  101. s = t;
  102. t = temp;
  103. }
  104. // adjust min and max values
  105. if(s > maxS)
  106. {
  107. maxS = s;
  108. }
  109. if(t < minT)
  110. {
  111. minT = t;
  112. }
  113. // check for intersection failure
  114. if(minT < 0.0 || maxS > 1.0 || maxS > minT)
  115. {
  116. return false;
  117. }
  118. }
  119. // done, have intersection
  120. return true;
  121. }
  122. //==============================================================================
  123. bool CollisionAlgorithmsMatrix::collide(const Ls& /*a*/, const Pcs& /*b*/)
  124. {
  125. ANKI_ASSERT(0 && "Not implemented yet");
  126. return false;
  127. }
  128. //==============================================================================
  129. bool CollisionAlgorithmsMatrix::collide(const Ls& ls, const Plane& p)
  130. {
  131. return ls.testPlane(p) == 0.0;
  132. }
  133. //==============================================================================
  134. bool CollisionAlgorithmsMatrix::collide(const Ls& /*a*/, const Ray& /*b*/)
  135. {
  136. ANKI_ASSERT(0 && "N/A");
  137. return false;
  138. }
  139. //==============================================================================
  140. bool CollisionAlgorithmsMatrix::collide(const Ls& ls, const Sphere& s)
  141. {
  142. const Vec3& v = ls.getDirection();
  143. Vec3 w0 = s.getCenter() - ls.getOrigin();
  144. float w0dv = w0.dot(v);
  145. float rsq = s.getRadius() * s.getRadius();
  146. if(w0dv < 0.0) // if the ang is >90
  147. {
  148. return w0.getLengthSquared() <= rsq;
  149. }
  150. Vec3 w1 = w0 - v; // aka center - P1, where P1 = seg.origin + seg.dir
  151. float w1dv = w1.dot(v);
  152. if(w1dv > 0.0) // if the ang is <90
  153. {
  154. return w1.getLengthSquared() <= rsq;
  155. }
  156. // the big parenthesis is the projection of w0 to v
  157. Vec3 tmp = w0 - (v * (w0.dot(v) / v.getLengthSquared()));
  158. return tmp.getLengthSquared() <= rsq;
  159. }
  160. //==============================================================================
  161. bool CollisionAlgorithmsMatrix::collide(const Ls& ls, const Aabb& aabb)
  162. {
  163. float maxS = std::numeric_limits<float>::min();
  164. float minT = std::numeric_limits<float>::max();
  165. // do tests against three sets of planes
  166. for(int i = 0; i < 3; ++i)
  167. {
  168. // segment is parallel to plane
  169. if(Math::isZero(ls.getDirection()[i]))
  170. {
  171. // segment passes by box
  172. if(ls.getOrigin()[i] < aabb.getMin()[i] ||
  173. ls.getOrigin()[i] > aabb.getMax()[i])
  174. {
  175. return false;
  176. }
  177. }
  178. else
  179. {
  180. // compute intersection parameters and sort
  181. float s = (aabb.getMin()[i] - ls.getOrigin()[i]) /
  182. ls.getDirection()[i];
  183. float t = (aabb.getMax()[i] - ls.getOrigin()[i]) /
  184. ls.getDirection()[i];
  185. if(s > t)
  186. {
  187. float temp = s;
  188. s = t;
  189. t = temp;
  190. }
  191. // adjust min and max values
  192. if(s > maxS)
  193. {
  194. maxS = s;
  195. }
  196. if(t < minT)
  197. {
  198. minT = t;
  199. }
  200. // check for intersection failure
  201. if(minT < 0.0 || maxS > 1.0 || maxS > minT)
  202. {
  203. return false;
  204. }
  205. }
  206. }
  207. // done, have intersection
  208. return true;
  209. }
  210. //==============================================================================
  211. // 2nd row =
  212. //==============================================================================
  213. //==============================================================================
  214. bool CollisionAlgorithmsMatrix::collide(const Obb& o0, const Obb& o1)
  215. {
  216. // extent vectors
  217. const Vec3& a = o0.getExtend();
  218. const Vec3& b = o1.getExtend();
  219. // test factors
  220. float cTest, aTest, bTest;
  221. bool parallelAxes = false;
  222. // transpose of rotation of B relative to A, i.e. (R_b^T * R_a)^T
  223. Mat3 rt = o0.getRotation().getTransposed() * o1.getRotation();
  224. // absolute value of relative rotation matrix
  225. Mat3 rabs;
  226. for(uint i = 0; i < 3; ++i)
  227. {
  228. for(uint j = 0; j < 3; ++j)
  229. {
  230. rabs(i, j) = fabs(rt(i, j));
  231. // if magnitude of dot product between axes is close to one
  232. if(rabs(i, j) + Math::EPSILON >= 1.0)
  233. {
  234. // then box A and box B have near-parallel axes
  235. parallelAxes = true;
  236. }
  237. }
  238. }
  239. // relative translation (in A's frame)
  240. Vec3 c = o0.getRotation().getTransposed() *
  241. (o1.getCenter() - o0.getCenter());
  242. // separating axis A0
  243. cTest = fabs(c.x());
  244. aTest = a.x();
  245. bTest = b.x() * rabs(0, 0) + b.y() * rabs(0, 1) + b.z() * rabs(0, 2);
  246. if(cTest > aTest + bTest)
  247. {
  248. return false;
  249. }
  250. // separating axis A1
  251. cTest = fabs(c.y());
  252. aTest = a.y();
  253. bTest = b.x() * rabs(1, 0) + b.y() * rabs(1, 1) + b.z() * rabs(1, 2);
  254. if(cTest > aTest + bTest)
  255. {
  256. return false;
  257. }
  258. // separating axis A2
  259. cTest = fabs(c.z());
  260. aTest = a.z();
  261. bTest = b.x() * rabs(2, 0) + b.y() * rabs(2, 1) + b.z() * rabs(2, 2);
  262. if(cTest > aTest + bTest)
  263. {
  264. return false;
  265. }
  266. // separating axis B0
  267. cTest = fabs(c.x() * rt(0, 0) + c.y() * rt(1, 0) + c.z() * rt(2, 0));
  268. aTest = a.x() * rabs(0, 0) + a.y() * rabs(1, 0) + a.z() * rabs(2, 0);
  269. bTest = b.x();
  270. if(cTest > aTest + bTest)
  271. {
  272. return false;
  273. }
  274. // separating axis B1
  275. cTest = fabs(c.x() * rt(0, 1) + c.y() * rt(1, 1) + c.z() * rt(2, 1));
  276. aTest = a.x() * rabs(0, 1) + a.y() * rabs(1, 1) + a.z() * rabs(2, 1);
  277. bTest = b.y();
  278. if(cTest > aTest + bTest)
  279. {
  280. return false;
  281. }
  282. // separating axis B2
  283. cTest = fabs(c.x() * rt(0, 2) + c.y() * rt(1, 2) + c.z() * rt(2, 2));
  284. aTest = a.x() * rabs(0, 2) + a.y() * rabs(1, 2) + a.z() * rabs(2, 2);
  285. bTest = b.z();
  286. if(cTest > aTest + bTest)
  287. {
  288. return false;
  289. }
  290. // if the two boxes have parallel axes, we're done, intersection
  291. if(parallelAxes)
  292. {
  293. return true;
  294. }
  295. // separating axis A0 x B0
  296. cTest = fabs(c.z() * rt(1, 0) - c.y() * rt(2, 0));
  297. aTest = a.y() * rabs(2, 0) + a.z() * rabs(1, 0);
  298. bTest = b.y() * rabs(0, 2) + b.z() * rabs(0, 1);
  299. if(cTest > aTest + bTest)
  300. {
  301. return false;
  302. }
  303. // separating axis A0 x B1
  304. cTest = fabs(c.z() * rt(1, 1) - c.y() * rt(2, 1));
  305. aTest = a.y() * rabs(2, 1) + a.z() * rabs(1, 1);
  306. bTest = b.x() * rabs(0, 2) + b.z() * rabs(0, 0);
  307. if(cTest > aTest + bTest)
  308. {
  309. return false;
  310. }
  311. // separating axis A0 x B2
  312. cTest = fabs(c.z() * rt(1, 2) - c.y() * rt(2, 2));
  313. aTest = a.y() * rabs(2, 2) + a.z() * rabs(1, 2);
  314. bTest = b.x() * rabs(0, 1) + b.y() * rabs(0, 0);
  315. if(cTest > aTest + bTest)
  316. {
  317. return false;
  318. }
  319. // separating axis A1 x B0
  320. cTest = fabs(c.x() * rt(2, 0) - c.z() * rt(0, 0));
  321. aTest = a.x() * rabs(2, 0) + a.z() * rabs(0, 0);
  322. bTest = b.y() * rabs(1, 2) + b.z() * rabs(1, 1);
  323. if(cTest > aTest + bTest)
  324. {
  325. return false;
  326. }
  327. // separating axis A1 x B1
  328. cTest = fabs(c.x() * rt(2, 1) - c.z() * rt(0, 1));
  329. aTest = a.x() * rabs(2, 1) + a.z() * rabs(0, 1);
  330. bTest = b.x() * rabs(1, 2) + b.z() * rabs(1, 0);
  331. if(cTest > aTest + bTest)
  332. {
  333. return false;
  334. }
  335. // separating axis A1 x B2
  336. cTest = fabs(c.x() * rt(2, 2) - c.z() * rt(0, 2));
  337. aTest = a.x() * rabs(2, 2) + a.z() * rabs(0, 2);
  338. bTest = b.x() * rabs(1, 1) + b.y() * rabs(1, 0);
  339. if(cTest > aTest + bTest)
  340. {
  341. return false;
  342. }
  343. // separating axis A2 x B0
  344. cTest = fabs(c.y() * rt(0, 0) - c.x() * rt(1, 0));
  345. aTest = a.x() * rabs(1, 0) + a.y() * rabs(0, 0);
  346. bTest = b.y() * rabs(2, 2) + b.z() * rabs(2, 1);
  347. if(cTest > aTest + bTest)
  348. {
  349. return false;
  350. }
  351. // separating axis A2 x B1
  352. cTest = fabs(c.y() * rt(0, 1) - c.x() * rt(1, 1));
  353. aTest = a.x() * rabs(1, 1) + a.y() * rabs(0, 1);
  354. bTest = b.x() * rabs(2, 2) + b.z() * rabs(2, 0);
  355. if(cTest > aTest + bTest)
  356. {
  357. return false;
  358. }
  359. // separating axis A2 x B2
  360. cTest = fabs(c.y() * rt(0, 2) - c.x() * rt(1, 2));
  361. aTest = a.x() * rabs(1, 2) + a.y() * rabs(0, 2);
  362. bTest = b.x() * rabs(2, 1) + b.y() * rabs(2, 0);
  363. if(cTest > aTest + bTest)
  364. {
  365. return false;
  366. }
  367. // all tests failed, have intersection
  368. return true;
  369. }
  370. //==============================================================================
  371. bool CollisionAlgorithmsMatrix::collide(const Obb& a, const Pcs& b)
  372. {
  373. ANKI_ASSERT(0 && "Not impelented yet");
  374. return false;
  375. }
  376. //==============================================================================
  377. bool CollisionAlgorithmsMatrix::collide(const Obb& a, const Plane& b)
  378. {
  379. return a.testPlane(b) == 0.0;
  380. }
  381. //==============================================================================
  382. bool CollisionAlgorithmsMatrix::collide(const Obb& obb, const Ray& r)
  383. {
  384. Aabb aabb_(-obb.getExtend(), obb.getExtend());
  385. Ray newray;
  386. Mat3 rottrans = obb.getRotation().getTransposed();
  387. newray.getOrigin() = rottrans * (r.getOrigin() - obb.getCenter());
  388. newray.getDirection() = rottrans * r.getDirection();
  389. return collide(newray, aabb_);
  390. }
  391. //==============================================================================
  392. bool CollisionAlgorithmsMatrix::collide(const Obb& obb, const Sphere& s)
  393. {
  394. Aabb aabb_(-obb.getExtend(), obb.getExtend()); // aabb_ is in "this" frame
  395. Vec3 newCenter = obb.getRotation().getTransposed() *
  396. (s.getCenter() - obb.getCenter());
  397. Sphere sphere_(newCenter, s.getRadius()); // sphere1 to "this" fame
  398. return collide(sphere_, aabb_);
  399. }
  400. //==============================================================================
  401. bool CollisionAlgorithmsMatrix::collide(const Obb& obb, const Aabb& aabb)
  402. {
  403. Vec3 center_ = (aabb.getMax() + aabb.getMin()) * 0.5;
  404. Vec3 extends_ = (aabb.getMax() - aabb.getMin()) * 0.5;
  405. Obb obb_(center_, Mat3::getIdentity(), extends_);
  406. return collide(obb, obb_);
  407. }
  408. //==============================================================================
  409. // 3rd line (PCS) =
  410. //==============================================================================
  411. //==============================================================================
  412. bool CollisionAlgorithmsMatrix::collide(const Pcs& a, const Pcs& b)
  413. {
  414. ANKI_ASSERT(0 && "Not implemented yet");
  415. return false;
  416. }
  417. //==============================================================================
  418. bool CollisionAlgorithmsMatrix::collide(const Pcs& a, const Plane& b)
  419. {
  420. ANKI_ASSERT(0 && "Not implemented yet");
  421. return false;
  422. }
  423. //==============================================================================
  424. bool CollisionAlgorithmsMatrix::collide(const Pcs& a, const Ray& b)
  425. {
  426. ANKI_ASSERT(0 && "Not implemented yet");
  427. return false;
  428. }
  429. //==============================================================================
  430. bool CollisionAlgorithmsMatrix::collide(const Pcs& a, const Sphere& b)
  431. {
  432. ANKI_ASSERT(0 && "Not implemented yet");
  433. return false;
  434. }
  435. //==============================================================================
  436. bool CollisionAlgorithmsMatrix::collide(const Pcs& a, const Aabb& b)
  437. {
  438. ANKI_ASSERT(0 && "Not implemented yet");
  439. return false;
  440. }
  441. //==============================================================================
  442. // 4th line (P) =
  443. //==============================================================================
  444. //==============================================================================
  445. bool CollisionAlgorithmsMatrix::collide(const Plane& p0, const Plane& p1)
  446. {
  447. return p0.getNormal() != p1.getNormal();
  448. }
  449. //==============================================================================
  450. bool CollisionAlgorithmsMatrix::collide(const Plane& p, const Ray& r)
  451. {
  452. return r.testPlane(p) == 0.0;
  453. }
  454. //==============================================================================
  455. bool CollisionAlgorithmsMatrix::collide(const Plane& p, const Sphere& s)
  456. {
  457. return s.testPlane(p) == 0.0;
  458. }
  459. //==============================================================================
  460. bool CollisionAlgorithmsMatrix::collide(const Plane& p, const Aabb& aabb)
  461. {
  462. return aabb.testPlane(p) == 0.0;
  463. }
  464. //==============================================================================
  465. // 5th line (R) =
  466. //==============================================================================
  467. //==============================================================================
  468. bool CollisionAlgorithmsMatrix::collide(const Ray& a, const Ray& b)
  469. {
  470. ANKI_ASSERT(0 && "N/A");
  471. return false;
  472. }
  473. //==============================================================================
  474. bool CollisionAlgorithmsMatrix::collide(const Ray& r, const Sphere& s)
  475. {
  476. Vec3 w(s.getCenter() - r.getOrigin());
  477. const Vec3& v = r.getDirection();
  478. float proj = v.dot(w);
  479. float wsq = w.getLengthSquared();
  480. float rsq = s.getRadius() * s.getRadius();
  481. if(proj < 0.0 && wsq > rsq)
  482. {
  483. return false;
  484. }
  485. float vsq = v.getLengthSquared();
  486. return (vsq * wsq - proj * proj <= vsq * rsq);
  487. }
  488. //==============================================================================
  489. bool CollisionAlgorithmsMatrix::collide(const Ray& r, const Aabb& aabb)
  490. {
  491. float maxS = std::numeric_limits<float>::min();
  492. float minT = std::numeric_limits<float>::max();
  493. // do tests against three sets of planes
  494. for(int i = 0; i < 3; ++i)
  495. {
  496. // ray is parallel to plane
  497. if(Math::isZero(r.getDirection()[i]))
  498. {
  499. // ray passes by box
  500. if(r.getOrigin()[i] < aabb.getMin()[i] ||
  501. r.getOrigin()[i] > aabb.getMax()[i])
  502. {
  503. return false;
  504. }
  505. }
  506. else
  507. {
  508. // compute intersection parameters and sort
  509. float s = (aabb.getMin()[i] - r.getOrigin()[i]) /
  510. r.getDirection()[i];
  511. float t = (aabb.getMax()[i] - r.getOrigin()[i]) /
  512. r.getDirection()[i];
  513. if(s > t)
  514. {
  515. float temp = s;
  516. s = t;
  517. t = temp;
  518. }
  519. // adjust min and max values
  520. if(s > maxS)
  521. {
  522. maxS = s;
  523. }
  524. if(t < minT)
  525. {
  526. minT = t;
  527. }
  528. // check for intersection failure
  529. if(minT < 0.0 || maxS > minT)
  530. {
  531. return false;
  532. }
  533. }
  534. }
  535. // done, have intersection
  536. return true;
  537. }
  538. //==============================================================================
  539. // 6th line (S) =
  540. //==============================================================================
  541. //==============================================================================
  542. bool CollisionAlgorithmsMatrix::collide(const Sphere& a, const Sphere& b)
  543. {
  544. float tmp = a.getRadius() + b.getRadius();
  545. return (a.getCenter() - b.getCenter()).getLengthSquared() <= tmp * tmp;
  546. }
  547. //==============================================================================
  548. bool CollisionAlgorithmsMatrix::collide(const Sphere& s, const Aabb& aabb)
  549. {
  550. const Vec3& c = s.getCenter();
  551. // find the box's closest point to the sphere
  552. Vec3 cp; // Closest Point
  553. for(uint i = 0; i < 3; i++)
  554. {
  555. // if the center is greater than the max then the closest
  556. // point is the max
  557. if(c[i] > aabb.getMax()[i])
  558. {
  559. cp[i] = aabb.getMax()[i];
  560. }
  561. else if(c[i] < aabb.getMin()[i]) // relative to the above
  562. {
  563. cp[i] = aabb.getMin()[i];
  564. }
  565. else
  566. {
  567. // the c lies between min and max
  568. cp[i] = c[i];
  569. }
  570. }
  571. float rsq = s.getRadius() * s.getRadius();
  572. // if the c lies totaly inside the box then the sub is the zero,
  573. // this means that the length is also zero and thus its always smaller
  574. // than rsq
  575. Vec3 sub = c - cp;
  576. if(sub.getLengthSquared() <= rsq)
  577. {
  578. return true;
  579. }
  580. return false;
  581. }
  582. //==============================================================================
  583. // 7th line (AABB) =
  584. //==============================================================================
  585. //==============================================================================
  586. bool CollisionAlgorithmsMatrix::collide(const Aabb& a, const Aabb& b)
  587. {
  588. // if separated in x direction
  589. if(a.getMin().x() > b.getMax().x() || b.getMin().x() > a.getMax().x())
  590. {
  591. return false;
  592. }
  593. // if separated in y direction
  594. if(a.getMin().y() > b.getMax().y() || b.getMin().y() > a.getMax().y())
  595. {
  596. return false;
  597. }
  598. // if separated in z direction
  599. if(a.getMin().z() > b.getMax().z() || b.getMin().z() > a.getMax().z())
  600. {
  601. return false;
  602. }
  603. // no separation, must be intersecting
  604. return true;
  605. }
  606. } // end namespace