ray-triangle-intersection
Version:
intersect a ray and triangle in 3 dimensions
35 lines (28 loc) • 850 B
JavaScript
var cross = require('gl-vec3/cross');
var dot = require('gl-vec3/dot');
var sub = require('gl-vec3/subtract');
var EPSILON = 0.000001;
var edge1 = [0,0,0];
var edge2 = [0,0,0];
var tvec = [0,0,0];
var pvec = [0,0,0];
var qvec = [0,0,0];
module.exports = intersectTriangle;
function intersectTriangle (out, pt, dir, tri) {
sub(edge1, tri[1], tri[0]);
sub(edge2, tri[2], tri[0]);
cross(pvec, dir, edge2);
var det = dot(edge1, pvec);
if (det < EPSILON) return null;
sub(tvec, pt, tri[0]);
var u = dot(tvec, pvec);
if (u < 0 || u > det) return null;
cross(qvec, tvec, edge1);
var v = dot(dir, qvec);
if (v < 0 || u + v > det) return null;
var t = dot(edge2, qvec) / det;
out[0] = pt[0] + t * dir[0];
out[1] = pt[1] + t * dir[1];
out[2] = pt[2] + t * dir[2];
return out;
}