Jean-Marc Le Roux Web, RIAs and chocolate spaghettis…

25May/120

Optimized AABB-Ray Intersection

As I am working on ray casting for Minko 2, I need to test the intersection between an axis aligned bounding box (AABB) and a ray. In order to do this, I implemented the slab method. Here is how it looks in AS3:

public function testRay(ray 		: Ray,
			transform	: Matrix4x4	= null,
			maxDistance	: Number	= Number.POSITIVE_INFINITY) : Boolean
{
	var localOrigin 	: Vector4	= transform
		? transform.transformVector(ray.origin, TMP_VECTOR4)
		: ray.origin;
	var ox			: Number	= localOrigin.x;
	var oy			: Number	= localOrigin.y;
	var oz			: Number	= localOrigin.z;
 
	var localDirection	: Vector4	= transform
		? transform.deltaTransformVector(ray.direction, TMP_VECTOR4)
		: ray.direction;
 
	localDirection.normalize();
 
	var dx		: Number	= 1.0 / localDirection.x;
	var dy		: Number	= 1.0 / localDirection.y;
	var dz		: Number	= 1.0 / localDirection.z;
 
	var minX	: Number	= _min.x;
	var minY	: Number	= _min.y;
	var minZ	: Number	= _min.z;
	var maxX	: Number	= _max.x;
	var maxY	: Number	= _max.y;
	var maxZ	: Number	= _max.z;
 
	var tx1		: Number	= (minX - ox) * dx;
	var tx2		: Number	= (maxX - ox) * dx;
 
	var min		: Number	= tx1 < tx2 ? tx1 : tx2;
	var max		: Number	= tx1 > tx2 ? tx1 : tx2;
	var tmin	: Number	= min;
	var tmax	: Number	= max;
 
	var ty1		: Number	= (minY - oy) * dy;
	var ty2		: Number	= (maxY - oy) * dy;
 
	min = ty1 < ty2 ? ty1 : ty2;
	max = ty1 > ty2 ? ty1 : ty2;
	tmin = tmin > min ? tmin : min;
	tmax = tmax < max ? tmax : max;
 
	var tz1		: Number	= (minZ - oz) * dz;
	var tz2		: Number	= (maxZ - oz) * dz;
 
	min = tz1 < tz2 ? tz1 : tz2;
	max = tz1 > tz2 ? tz1 : tz2;
	tmin = tmin > min ? tmin : min;
	tmax = tmax < max ? tmax : max;
 
	return tmax >= Math.max(0, tmin) && tmin < maxDistance;
}

You can find this method in the latest version of the BoundingBox class on github. If you have questions/suggestions, you can post in the comments or on Aerys Answers.

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

No trackbacks yet.