ray-aabb
v3.0.2
Published
test if a ray intersects an aabb in 2d/3d space
Downloads
26
Maintainers
Readme
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: aRay
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 detectedfalse
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
npm run demo-2d
3d (software raytracer)
npm run demo-raytracer