ray-aabb

3.0.2 • Public • Published

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 origin
  • ray_direction - a normalized vector defining the ray direction returns: a Ray instance

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

  • true if intersection detected
  • false if no intersection

if 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.

platforms

node and evergreen browsers using browserify

Demos

2d

random-ray

npm run demo-2d

3d (software raytracer)

random-ray

npm run demo-raytracer

license

MIT

Package Sidebar

Install

npm i ray-aabb

Weekly Downloads

6

Version

3.0.2

License

MIT

Last publish

Collaborators

  • tmpvar