bvh-aabbs
v0.0.112
Published
bounding volume hierarchy for axis-aligned bounding boxes
Downloads
9
Maintainers
Readme
bvh-aabbs
Bounding volume hierarchy for axis-aligned bounding boxes.
Put aabbs into a flat array BVH structure to use for raycasting and distance queries in JS or GLSL
Uses code scavenged from Erich Loftis' awesome THREE.js-PathTracing-Renderer
Includes JS port of the GLSL BVH raycasting function, also adapted into a distance query function.
BVH builders use this code by Erich Loftis in turn inspired by this code by Thanassis Tsiodras
Installation
npm i bvh-aabbs
Usage
//"prove" that the BVH works by raytracing using ascii-raytracer
//generate random box [[x,y,z],[x,y,z]]
var randomBox3d = function(){
var range = 32;
var boxSizeMax = 8;
var p0 = [Math.random()*range,Math.random()*range,Math.random()*range];
var p1 = [p0[0]+Math.random()*boxSizeMax,p0[1]+Math.random()*boxSizeMax,p0[2]+Math.random()*boxSizeMax];
return [p0,p1];
}
var randomBoxes = [];
for(var i=0; i<100; i++){
randomBoxes.push(randomBox3d());
}
var ba = require('bvh-aabbs');
var fastBVHMode = false; //fast mode vs SAH mode (surface area heuristic)
var bvhArray = ba.aabbsToBvhArray(randomBoxes, fastBVHMode) //bvh data structure, flat array
var traceFunc = function(ray){
var o = ray.point;
var v = ray.vector;
var res = ba.raycast([o.x,o.y,o.z], [v.x,v.y,v.z], bvhArray);
return res;
}
var distFunc = function(x,y,z){
return ba.distance([x,y,z], bvhArray);
}
var config = {
raytraceFunction: traceFunc,
distanceFunction: distFunc,
boxes: randomBoxes,
resolution: 64,
aspectRatio: 1.0,
mouseControl:true,
cameraMode: 0 //0 normals 1 depth
}
require('ascii-raytracer').runScene(config);