intersectsTriangle method

bool intersectsTriangle(
  1. Triangle triangle
)

triangle - page:Triangle to check for intersection against.

Determines whether or not this box intersects triangle.

Implementation

bool intersectsTriangle(Triangle triangle) {
  if (isEmpty()) {
    return false;
  }

  // compute box center and extents
  getCenter(_center);
  _extents.sub2(max, _center);

  // translate triangle to aabb origin
  _v0.sub2(triangle.a, _center);
  _box3v1.sub2(triangle.b, _center);
  _v2.sub2(triangle.c, _center);

  // compute edge vectors for triangle
  _f0.sub2(_box3v1, _v0);
  _f1.sub2(_v2, _box3v1);
  _f2.sub2(_v0, _v2);

  // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
  // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
  // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
  List<double> axes = [
    0,
    -_f0.z,
    _f0.y,
    0,
    -_f1.z,
    _f1.y,
    0,
    -_f2.z,
    _f2.y,
    _f0.z,
    0,
    -_f0.x,
    _f1.z,
    0,
    -_f1.x,
    _f2.z,
    0,
    -_f2.x,
    -_f0.y,
    _f0.x,
    0,
    -_f1.y,
    _f1.x,
    0,
    -_f2.y,
    _f2.x,
    0
  ];
  if (!satForAxes(axes, _v0, _box3v1, _v2, _extents)) {
    return false;
  }

  // test 3 face normals from the aabb
  axes = [1, 0, 0, 0, 1, 0, 0, 0, 1];
  if (!satForAxes(axes, _v0, _box3v1, _v2, _extents)) {
    return false;
  }

  // finally testing the face normal of the triangle
  // use already existing triangle edge vectors here
  _triangleNormal.cross2(_f0, _f1);
  axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z];

  return satForAxes(axes, _v0, _box3v1, _v2, _extents);
}