Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function PlaneBoxCollision(normal, vertex, maxBox)
- {
- var q;
- var vmin = [], vmax = [], v;
- for(q = 0; q <= 2; q++)
- {
- v = vertex[q];
- if(normal[q] > 0)
- {
- vmin[q] = - maxBox[q] - v;
- vmax[q] = maxBox[q] - v;
- }
- else
- {
- vmin[q] = maxBox[q] - v;
- vmax[q] = - maxBox[q] - v;
- }
- }
- if((normal[0] * vmin[0]) + (normal[1] * vmin[1]) + (normal[2] * vmin[2]) > 0) return 0;
- if((normal[0] * vmax[0]) + (normal[1] * vmax[1]) + (normal[2] * vmax[2]) >= 0) return 1;
- return 0;
- }
- function TriangleBoxCollision(boxCenter, boxHalfSize, triangleVertices)
- {
- var v0 = [], v1 = [], v2 = [];
- var min, max, p0, p1, p2, rad, fex, fey, fez;
- var normal = [], e0 = [], e1 = [], e2 = [];
- v0[0] = triangleVertices[0][0] - boxCenter[0];
- v0[1] = triangleVertices[0][1] - boxCenter[1];
- v0[2] = triangleVertices[0][2] - boxCenter[2];
- v1[0] = triangleVertices[1][0] - boxCenter[0];
- v1[1] = triangleVertices[1][1] - boxCenter[1];
- v1[2] = triangleVertices[1][2] - boxCenter[2];
- v2[0] = triangleVertices[2][0] - boxCenter[0];
- v2[1] = triangleVertices[2][1] - boxCenter[1];
- v2[2] = triangleVertices[2][2] - boxCenter[2];
- e0[0] = v1[0] - v0[0];
- e0[1] = v1[1] - v0[1];
- e0[2] = v1[2] - v0[2];
- e1[0] = v2[0] - v1[0];
- e1[1] = v2[1] - v1[1];
- e1[2] = v2[2] - v1[2];
- e2[0] = v0[0] - v2[0];
- e2[1] = v0[1] - v2[1];
- e2[2] = v0[2] - v2[2];
- fex = Math.abs(e0[0]);
- fey = Math.abs(e0[1]);
- fez = Math.abs(e0[2]);
- p0 = e0[2] * v0[1] - e0[1] * v0[2];
- p2 = e0[2] * v2[1] - e0[1] * v2[2];
- if(p0 < p2)
- {
- min = p0;
- max = p2;
- }
- else
- {
- min = p2;
- max = p0;
- }
- rad = fez * boxHalfSize[1] + fey * boxHalfSize[2];
- if((min > rad) || (max < -rad)) return 0;
- p0 = -e0[2] * v0[0] + e0[0] * v0[2];
- p2 = -e0[2] * v2[0] + e0[0] * v2[2];
- if(p0 < p2)
- {
- min = p0;
- max = p2;
- }
- else
- {
- min = p2;
- max = p0;
- }
- rad = fez * boxHalfSize[0] + fex * boxHalfSize[2];
- if((min > rad) || (max < -rad)) return 0;
- p1 = e0[1] * v1[0] - e0[0] * v1[1];
- p2 = e0[1] * v2[0] - e0[0] * v2[1];
- if(p2 < p1)
- {
- min = p2;
- max = p1;
- }
- else
- {
- min = p1;
- max = p2;
- }
- rad = fey * boxHalfSize[0] + fex * boxHalfSize[1];
- if((min > rad) || (max < -rad)) return 0;
- fex = Math.abs(e1[0]);
- fey = Math.abs(e1[1]);
- fez = Math.abs(e1[2]);
- p0 = e1[2] * v0[1] - e1[1] * v0[2];
- p2 = e1[2] * v2[1] - e1[1] * v2[2];
- if(p0 < p2)
- {
- min = p0;
- max = p2;
- }
- else
- {
- min = p2;
- max = p0;
- }
- rad = fez * boxHalfSize[1] + fey * boxHalfSize[2];
- if((min > rad) || (max < -rad)) return 0;
- p0 = -e1[2] * v0[0] + e1[0] * v0[2];
- p2 = -e1[2] * v2[0] + e1[0] * v2[2];
- if(p0 < p2)
- {
- min = p0;
- max = p2;
- }
- else
- {
- min = p2;
- max = p0;
- }
- rad = fez * boxHalfSize[0] + fex * boxHalfSize[2];
- if((min > rad) || (max < -rad)) return 0;
- p0 = e1[1] * v0[0] - e1[0] * v0[1];
- p1 = e1[1] * v1[0] - e1[0] * v1[1];
- if(p0 < p1)
- {
- min = p0;
- max = p1;
- }
- else
- {
- min = p1;
- max = p0;
- }
- rad = fey * boxHalfSize[0] + fex * boxHalfSize[1];
- if((min > rad) || (max < -rad)) return 0;
- fex = Math.abs(e2[0]);
- fey = Math.abs(e2[1]);
- fez = Math.abs(e2[2]);
- p0 = e2[2] * v0[1] - e2[1] * v0[2];
- p1 = e2[2] * v1[1] - e2[1] * v1[2];
- if(p0 < p1)
- {
- min = p0;
- max = p1;
- }
- else
- {
- min = p1;
- max = p0;
- }
- rad = fez * boxHalfSize[1] + fey * boxHalfSize[2];
- if((min > rad) || (max < -rad)) return 0;
- p0 = -e2[2] * v0[0] + e2[0] * v0[2];
- p1 = -e2[2] * v1[0] + e2[0] * v1[2];
- if(p0 < p1)
- {
- min = p0;
- max = p1;
- }
- else
- {
- min = p1;
- max = p0;
- }
- rad = fez * boxHalfSize[0] + fex * boxHalfSize[2];
- if((min > rad) || (max < -rad)) return 0;
- p1 = e2[1] * v1[0] - e2[0] * v1[1];
- p2 = e2[1] * v2[0] - e2[0] * v2[1];
- if(p2 < p1)
- {
- min = p2;
- max = p1;
- }
- else
- {
- min = p1;
- max = p2;
- }
- rad = fey * boxHalfSize[0] + fex * boxHalfSize[1];
- if((min > rad) || (max < -rad)) return 0;
- min = Math.min(v0[0], v1[0], v2[0]);
- max = Math.max(v0[0], v1[0], v2[0]);
- if((min > boxHalfSize[0]) || (max < -boxHalfSize[0])) return 0;
- min = Math.min(v0[1], v1[1], v2[1]);
- max = Math.max(v0[1], v1[1], v2[1]);
- if((min > boxHalfSize[1]) || (max < -boxHalfSize[1])) return 0;
- min = Math.min(v0[2], v1[2], v2[2]);
- max = Math.max(v0[2], v1[2], v2[2]);
- if((min > boxHalfSize[2]) || (max < -boxHalfSize[2])) return 0;
- normal[0] = e0[1] * e1[2] - e0[2] * e1[1];
- normal[1] = e0[2] * e1[0] - e0[0] * e1[2];
- normal[2] = e0[0] * e1[1] - e0[1] * e1[0];
- if(!PlaneBoxCollision(normal, v0, boxHalfSize)) return 0;
- return 1;
- }
Add Comment
Please, Sign In to add comment