triangleIntersect method
Find where triangle intersect
Implementation
Vector3? triangleIntersect(Vector3 origin, Vector3 direction, Face face, bool backfaceCulling){
Vector3 diff = Vector3.zero();
Vector3 edge1 = Vector3.zero();
Vector3 edge2 = Vector3.zero();
Vector3 normal = Vector3.zero();
Vector3 a = face.a, b = face.b, c = face.c;
int sign;
double dnd;
edge1.sub2(b, a);
edge2.sub2(c, a);
normal.cross2(edge1, edge2);
dnd = direction.dot(normal);
if(dnd > 0){
if(backfaceCulling)return null;
sign = 1;
}
else if(dnd < 0){
sign = -1;
dnd = -dnd;
}
else {
return null;
}
diff.sub2(origin, a);
double ddqxe2 = sign * direction.dot(edge2.cross2(diff, edge2));
// b1 < 0, no intersection
if ( ddqxe2 < 0 ) {
return null;
}
double ddex1xq = sign * direction.dot(edge1.cross(diff));
// b2 < 0, no intersection
if(ddex1xq < 0){
return null;
}
// b1+b2 > 1, no intersection
if(ddqxe2 + ddex1xq > dnd){
return null;
}
// Line intersects triangle, check if ray does.
double qdn = -sign * diff.dot(normal);
// t < 0, no intersection
if(qdn < 0){
return null;
}
// Ray intersects triangle.
return Vector3.copy( direction )..scale(qdn / dnd)..add( origin );
}