In computer graphics, the slab method is an algorithm used to solve the ray-box intersection problem in case of an axis-aligned bounding box (AABB), i.e. to determine the intersection points between a ray and the box. Due to its efficient nature, that can allow for a branch-free implementation, it is widely used in computer graphics applications.[1][2]
Algorithm
editThe idea behind the algorithm is to clip the ray with the planes containing the six faces of the box. Each pair of parallel planes defines a slab, and the volume contained in the box is the intersection of the three slabs. Therefore, the portion of ray within the box (if any, given that the ray effectively intersects the box) will be given by the intersection of the portions of ray within each of the three slabs.[3]
A tridimensional AABB can be represented by two triples and denoting the low and high bounds of the box along each dimension. A point along a ray with origin and direction can be expressed in parametric form as
- .
Assuming that all intersections exist, i.e. , solving for gives
and therefore the two intersections of the ray with the two planes orthogonal to the -th coordinate axis will be given by
The close and far extrema of the segment within the -th slab will be given by
and the intersection of all these segments is
Such resulting segment will be inside the box, and therefore an intersection exists, only if .[4] The sign of determines if the intersection happens ahead or behind the origin of the ray, which might be interesting in applications such as ray casting, where only intersections in front of the camera are of interest. The two intersection points will therefore be given by
While the equations above are well defined for real-valued variables only if , i.e. if the ray is not parallel to any of the coordinate axes, the algorithm can be applied to an extended real number arithmetic (such as the one implemented by IEEE 754) to handle rays parallel to an axis, as long as the origin of the ray itself does not lie on one of the faces of the bounding box. In such arithmetic, the intersections with the planes parallel to the ray will be given by or , and the algorithm will still work as expected. If the origin lies on a face of the bounding box, then for some it will happen that , which is undefined (in IEEE 754 it is represented by NaN). However, implementations of the IEEE 754-2008 minNum and maxNum functions[5] will treat NaN as a missing value, and when comparing a well-defined value with a NaN they will always return the well-defined value,[6] and they will therefore be able to handle even such corner case. An alternative approach to handle corner cases is to avoid divisions by zero altogether, which can be achieved by replacing the inverse of zero with a large arbitrary constant number.[4]
References
edit- ^ Shirley, Wald & Marrs 2021.
- ^ Majercik et al. 2018.
- ^ Kay & Kajiya 1986, p. 272.
- ^ a b Kay & Kajiya 1986, p. 273.
- ^ For example, fmin and fmax in C99.
- ^ IEEE Standards Committee 2008.
Sources
edit- IEEE Standards Committee (2008). IEEE standard for floating-point arithmetic: 754-2008. Washington, DC: IEEE Computer Society.
- Kay, Timothy L.; Kajiya, James T. (1986). Ray tracing complex scenes. ACM SIGGRAPH computer graphics. Vol. 20. Dallas. pp. 269–278.
- Majercik, Alexander; Crassin, Cyril; Shirley, Peter; McGuire, Morgan (2018). "A Ray-Box Intersection Algorithm and Efficient Dynamic Voxel Rendering". Journal of Computer Graphics Techniques (JCGT). 7 (3): 66–81.
- Shirley, Peter; Wald, Ingo; Marrs, Adam (2021). "Ray Axis-Aligned Bounding Box Intersection". Ray Tracing Gems II. Berkeley, CA: Apress.
External links
edit- Barnes, Tavian (27 July 2022). "Fast, Branchless Ray/Bounding Box Intersections, Part 3: Boundaries". Archived from the original on 2023-07-22.