Guest User

TriangleBox.js

a guest
Jul 30th, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function PlaneBoxCollision(normal, vertex, maxBox)
  2. {
  3.     var q;
  4.     var vmin = [], vmax = [], v;
  5.     for(q = 0; q <= 2; q++)
  6.     {
  7.         v = vertex[q];
  8.         if(normal[q] > 0)
  9.         {
  10.             vmin[q] = - maxBox[q] - v;
  11.             vmax[q] = maxBox[q] - v;
  12.         }
  13.         else
  14.         {
  15.             vmin[q] = maxBox[q] - v;
  16.             vmax[q] = - maxBox[q] - v;
  17.         }
  18.     }
  19.     if((normal[0] * vmin[0]) + (normal[1] * vmin[1]) + (normal[2] * vmin[2]) > 0) return 0;
  20.     if((normal[0] * vmax[0]) + (normal[1] * vmax[1]) + (normal[2] * vmax[2]) >= 0) return 1;
  21.     return 0;
  22. }
  23.  
  24. function TriangleBoxCollision(boxCenter, boxHalfSize, triangleVertices)
  25. {
  26.     var v0 = [], v1 = [], v2 = [];
  27.     var min, max, p0, p1, p2, rad, fex, fey, fez;
  28.     var normal = [], e0 = [], e1 = [], e2 = [];
  29.     v0[0] = triangleVertices[0][0] - boxCenter[0];
  30.     v0[1] = triangleVertices[0][1] - boxCenter[1];
  31.     v0[2] = triangleVertices[0][2] - boxCenter[2];
  32.     v1[0] = triangleVertices[1][0] - boxCenter[0];
  33.     v1[1] = triangleVertices[1][1] - boxCenter[1];
  34.     v1[2] = triangleVertices[1][2] - boxCenter[2];
  35.     v2[0] = triangleVertices[2][0] - boxCenter[0];
  36.     v2[1] = triangleVertices[2][1] - boxCenter[1];
  37.     v2[2] = triangleVertices[2][2] - boxCenter[2];
  38.     e0[0] = v1[0] - v0[0];
  39.     e0[1] = v1[1] - v0[1];
  40.     e0[2] = v1[2] - v0[2];
  41.     e1[0] = v2[0] - v1[0];
  42.     e1[1] = v2[1] - v1[1];
  43.     e1[2] = v2[2] - v1[2];
  44.     e2[0] = v0[0] - v2[0];
  45.     e2[1] = v0[1] - v2[1];
  46.     e2[2] = v0[2] - v2[2];
  47.     fex = Math.abs(e0[0]);
  48.     fey = Math.abs(e0[1]);
  49.     fez = Math.abs(e0[2]);
  50.     p0 = e0[2] * v0[1] - e0[1] * v0[2];
  51.     p2 = e0[2] * v2[1] - e0[1] * v2[2];
  52.     if(p0 < p2)
  53.     {
  54.         min = p0;
  55.         max = p2;
  56.     }
  57.     else
  58.     {
  59.         min = p2;
  60.         max = p0;
  61.     }
  62.     rad = fez * boxHalfSize[1] + fey * boxHalfSize[2];
  63.     if((min > rad) || (max < -rad)) return 0;
  64.     p0 = -e0[2] * v0[0] + e0[0] * v0[2];
  65.     p2 = -e0[2] * v2[0] + e0[0] * v2[2];
  66.     if(p0 < p2)
  67.     {
  68.         min = p0;
  69.         max = p2;
  70.     }
  71.     else
  72.     {
  73.         min = p2;
  74.         max = p0;
  75.     }
  76.     rad = fez * boxHalfSize[0] + fex * boxHalfSize[2];
  77.     if((min > rad) || (max < -rad)) return 0;
  78.     p1 = e0[1] * v1[0] - e0[0] * v1[1];
  79.     p2 = e0[1] * v2[0] - e0[0] * v2[1];
  80.     if(p2 < p1)
  81.     {
  82.         min = p2;
  83.         max = p1;
  84.     }
  85.     else
  86.     {
  87.         min = p1;
  88.         max = p2;
  89.     }
  90.     rad = fey * boxHalfSize[0] + fex * boxHalfSize[1];
  91.     if((min > rad) || (max < -rad)) return 0;
  92.     fex = Math.abs(e1[0]);
  93.     fey = Math.abs(e1[1]);
  94.     fez = Math.abs(e1[2]);
  95.     p0 = e1[2] * v0[1] - e1[1] * v0[2];
  96.     p2 = e1[2] * v2[1] - e1[1] * v2[2];
  97.     if(p0 < p2)
  98.     {
  99.         min = p0;
  100.         max = p2;
  101.     }
  102.     else
  103.     {
  104.         min = p2;
  105.         max = p0;
  106.     }
  107.     rad = fez * boxHalfSize[1] + fey * boxHalfSize[2];
  108.     if((min > rad) || (max < -rad)) return 0;
  109.     p0 = -e1[2] * v0[0] + e1[0] * v0[2];
  110.     p2 = -e1[2] * v2[0] + e1[0] * v2[2];
  111.     if(p0 < p2)
  112.     {
  113.         min = p0;
  114.         max = p2;
  115.     }
  116.     else
  117.     {
  118.         min = p2;
  119.         max = p0;
  120.     }
  121.     rad = fez * boxHalfSize[0] + fex * boxHalfSize[2];
  122.     if((min > rad) || (max < -rad)) return 0;
  123.     p0 = e1[1] * v0[0] - e1[0] * v0[1];
  124.     p1 = e1[1] * v1[0] - e1[0] * v1[1];
  125.     if(p0 < p1)
  126.     {
  127.         min = p0;
  128.         max = p1;
  129.     }
  130.     else
  131.     {
  132.         min = p1;
  133.         max = p0;
  134.     }
  135.     rad = fey * boxHalfSize[0] + fex * boxHalfSize[1];
  136.     if((min > rad) || (max < -rad)) return 0;
  137.     fex = Math.abs(e2[0]);
  138.     fey = Math.abs(e2[1]);
  139.     fez = Math.abs(e2[2]);
  140.     p0 = e2[2] * v0[1] - e2[1] * v0[2];
  141.     p1 = e2[2] * v1[1] - e2[1] * v1[2];
  142.     if(p0 < p1)
  143.     {
  144.         min = p0;
  145.         max = p1;
  146.     }
  147.     else
  148.     {
  149.         min = p1;
  150.         max = p0;
  151.     }
  152.     rad = fez * boxHalfSize[1] + fey * boxHalfSize[2];
  153.     if((min > rad) || (max < -rad)) return 0;
  154.     p0 = -e2[2] * v0[0] + e2[0] * v0[2];
  155.     p1 = -e2[2] * v1[0] + e2[0] * v1[2];
  156.     if(p0 < p1)
  157.     {
  158.         min = p0;
  159.         max = p1;
  160.     }
  161.     else
  162.     {
  163.         min = p1;
  164.         max = p0;
  165.     }
  166.     rad = fez * boxHalfSize[0] + fex * boxHalfSize[2];
  167.     if((min > rad) || (max < -rad)) return 0;
  168.     p1 = e2[1] * v1[0] - e2[0] * v1[1];
  169.     p2 = e2[1] * v2[0] - e2[0] * v2[1];
  170.     if(p2 < p1)
  171.     {
  172.         min = p2;
  173.         max = p1;
  174.     }
  175.     else
  176.     {
  177.         min = p1;
  178.         max = p2;
  179.     }
  180.     rad = fey * boxHalfSize[0] + fex * boxHalfSize[1];
  181.     if((min > rad) || (max < -rad)) return 0;
  182.     min = Math.min(v0[0], v1[0], v2[0]);
  183.     max = Math.max(v0[0], v1[0], v2[0]);
  184.     if((min > boxHalfSize[0]) || (max < -boxHalfSize[0])) return 0;
  185.     min = Math.min(v0[1], v1[1], v2[1]);
  186.     max = Math.max(v0[1], v1[1], v2[1]);
  187.     if((min > boxHalfSize[1]) || (max < -boxHalfSize[1])) return 0;
  188.     min = Math.min(v0[2], v1[2], v2[2]);
  189.     max = Math.max(v0[2], v1[2], v2[2]);
  190.     if((min > boxHalfSize[2]) || (max < -boxHalfSize[2])) return 0;
  191.     normal[0] = e0[1] * e1[2] - e0[2] * e1[1];
  192.     normal[1] = e0[2] * e1[0] - e0[0] * e1[2];
  193.     normal[2] = e0[0] * e1[1] - e0[1] * e1[0];
  194.     if(!PlaneBoxCollision(normal, v0, boxHalfSize)) return 0;
  195.     return 1;
  196. }
Add Comment
Please, Sign In to add comment