test if a ray intersects an aabb in 3d space
MIT License
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
npm install ray-aabb
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 ]
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 directionRay
instanceRay#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
true
if intersection detectedfalse
if no intersectionif normal
is passed:
false
if 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.node and evergreen browsers using browserify
npm run demo-2d
npm run demo-raytracer