ray-aabb v3.0.2
ray-aabb
test if a ray intersects an aabb in 2d/3d space
Implemented via the techniques described in Fast Ray/Axis-Aligned Bounding Box Overlap Tests using Ray Slopes
install
npm install ray-aabb
use
var createRay = require('ray-aabb');
/*
+------+
/ /|
(-1, 1, 0) ----> +------+ |
| | +
| |/
+------+
*/
var ray_origin = [-1, 1, 0];
var ray_direction = [1, 0, 0];
var ray = createRay(ray_origin, ray_direction);
var box = [
[0, 0, 0],
[2, 2, 2]
];
console.log(ray.intersects(box));
// outputs: true
// avoid allocating new memory by reusing rays
ray.update(ray_origin, [-1, 0, 0]);
console.log(ray.intersects(box));
// outputs: false
var normal = [0, 0, 0];
var d = ray.intersects(box, normal);
console.log(d);
// outputs: 1
console.log(normal);
// outputs: [ -1, 0, 0 ]api surface
all vectors specified are arrays in the format: [x, y, z] with z being optional for 2d vectors
createRay(ray_origin, ray_direction)
parameters:
ray_origin- a vector defining the ray originray_direction- a normalized vector defining the ray direction returns: aRayinstance
Ray#update(ray_origin, ray_direction)
Allows Ray instances to be reused by precomputing ray classification. The intention here is that you will be casting a ray against many aabbs
parameters: same as createRay
returns: this (e.g. ray.update(ro, rd).intersects(box)
Ray#intersects(aabb, normal)
where aabb specifies the corners of the bounding box:
[[x1, y1, z1], [x2, y2, z2]]and the optional normal argument is a 2d/3d vector (e.g., [0, 0]) that will be populated with the non-normalized normal of the corner/edge/face that the ray intersected with.
returns
if normal is not passed
trueif intersection detectedfalseif no intersection
if normal is passed:
falseif no intersection or a number denoting how far along the ray the collision occurred. You can use this number to compute the point of intersection. See the demos for example usage.
platforms
node and evergreen browsers using browserify
Demos
2d

npm run demo-2d
3d (software raytracer)

npm run demo-raytracer