From 75b436e010ac701f0bf1188660922cda36dc6bd6 Mon Sep 17 00:00:00 2001 From: vts Date: Sun, 1 Jul 2012 01:02:26 +0000 Subject: [PATCH] A more detailed explanation of how the slab method for OBB/ray intersection from Real-Time Rendering, Third Edition works. This was SVN commit r12048. --- docs/ray_intersect.bib | 7 ++ docs/ray_intersect.pdf | Bin 0 -> 38893 bytes docs/ray_intersect.tex | 256 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 263 insertions(+) create mode 100644 docs/ray_intersect.bib create mode 100644 docs/ray_intersect.pdf create mode 100644 docs/ray_intersect.tex diff --git a/docs/ray_intersect.bib b/docs/ray_intersect.bib new file mode 100644 index 0000000000..04f63ab17f --- /dev/null +++ b/docs/ray_intersect.bib @@ -0,0 +1,7 @@ +@book{real_time_rendering_3, + author = {Akenine-M\"oller, Tomas and Haines, Eric and Hoffman, Nathy}, + title = {Real-Time Rendering, Third Edition}, + year = {2008}, + isbn = {978-1-56881-424-7}, + publisher = {A K Peters, Ltd.}, +} diff --git a/docs/ray_intersect.pdf b/docs/ray_intersect.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e4ce4e728eaa13affd2100844747d6f59fd33be GIT binary patch literal 38893 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,scale=1] +\tikzstyle{empty}=[inner sep=0pt] +\tikzstyle{dot}=[shape=circle,draw,fill=black,inner sep=0pt,minimum size=1mm] + +\begin{scope}[rotate=-15] +%\draw[help lines] (-5,-6) grid (7,4); + +% box points (top right, bottom right, etc.) +\node[empty] (box tr) at (4,2) {}; +\node[empty] (box br) at (4,-2) {}; +\node[empty] (box bl) at (-4,-2) {}; +\node[empty] (box tl) at (-4,2) {}; +% slab points (same as box, but a bit wider) +\node[empty] (slab tl) at (-5.5,2) {}; +\node[empty] (slab bl) at (-5.5,-2) {}; +\node[empty] (slab tr) at (7.5,2) {}; +\node[empty] (slab br) at (7.5,-2) {}; + +\node[empty] (center) at (0,0) {}; +\node[empty] (ray origin) at (-2.5,-5) {}; +\node[empty] (ray direction) at (0.78221, 0.640184) {}; +\node[empty] (ray end) at ($(ray origin) + 12*(ray direction)$) {}; + +\node[empty] (p) at +($(center) - (ray origin)$) {}; + +% intersection points between ray and slab lines +\node[empty] (t1) at (intersection cs: + first line={(ray origin) -- (ray end)}, + second line={(slab bl) -- (slab br)}) {}; +\node[empty] (t2) at (intersection cs: + first line={(ray origin) -- (ray end)}, + second line={(slab tl) -- (slab tr)}) {}; + +% normal vector and axis through center, t1 and t2 +\node[empty] (normal) at (0,1) {}; +\node[empty] (normal through center start) at ($(center) - 6*(normal)$) {}; +\node[empty] (normal through center end) at ($(center) + 4*(normal)$) {}; +\node[empty] (normal through t1 start) at ($(t1) - 4*(normal)$) {}; +\node[empty] (normal through t1 end) at ($(t1) + 6*(normal)$) {}; +\node[empty] (normal through t2 start) at ($(t2) - 8*(normal)$) {}; +\node[empty] (normal through t2 end) at ($(t2) + 2*(normal)$) {}; + +\node[empty] (q1) at ($(normal through t1 start)!(ray origin)!(normal through t1 end)$) {}; +\node[empty] (q2) at ($(normal through t2 start)!(ray origin)!(normal through t2 end)$) {}; + +% draw the slab background and the box +\draw[fill=gray!10,fill opacity=80,draw=green!0] (slab bl) rectangle (box tl); +\draw[fill=gray!10,fill opacity=80,draw=green!0] (box br) rectangle (slab tr); +\draw[dashed] (slab tl) -- (box tl); +\draw[dashed] (box tr) -- (slab tr); +\draw[dashed] (box br) -- (slab br); +\draw[dashed] (slab bl) -- (box bl); +\draw (box bl) rectangle (box tr); + +% draw node points +\filldraw[fill=black] (center) circle (1.5pt) node[below right,xshift=-1mm] {$\mathbf{a}_c$}; +\filldraw[fill=black] (ray origin) circle (1.5pt) node[below] {$\mathbf{o}$}; +\filldraw[fill=black] (t1) circle (1.5pt) node[above left,xshift=1mm] {$t_1$}; +\filldraw[fill=black] (t2) circle (1.5pt) node[above left,xshift=1mm] {$t_2$}; +\filldraw[fill=black] (q1) circle (1.5pt) node[below,xshift=2mm,yshift=-.5mm] {$q_1$}; +\filldraw[fill=black] (q2) circle (1.5pt) node[below,xshift=2mm,yshift=-.5mm] {$q_2$}; + +% draw normal vector, ray, p +\draw[->] (center) -- (0,1) node[left] {$\mathbf{a}_i$}; +\draw[->] (ray origin) -- (ray end); +\draw[->|] (ray origin) -- +($(ray direction)$) node[midway,right,yshift=-1mm] {$\mathbf{d}$}; +\draw[->,shorten >=1mm] (ray origin) -- +($(p)$) node[midway,left] {$\mathbf{p}$}; + +% line parallel to ray through origin, and normal axes through t1 and t2 +\draw[dashed] ($(center) - 6*(ray direction)$) -- ($(center) + 6*(ray direction)$); +\draw[dashed] (normal through t1 start) -- (normal through t1 end); +\draw[dashed] (normal through t2 start) -- (normal through t2 end); + +% draw angle arcs +% TODO: let TikZ figure out that the angle is about 50 degrees +\draw (center) ++ (40:0.5cm) arc (40:90:0.5cm) node[right,yshift=1mm,xshift=1mm] {$\theta$}; +\draw (t1) ++ (-90:0.5cm) arc (-90:-140:0.5cm) node[below,yshift=-1mm] {$\theta$}; +\draw (t2) ++ (-90:0.5cm) arc (-90:-140:0.5cm) node[below,yshift=-1mm] {$\theta$}; + +% draw line between (ray origin) and (ray origin) projected onto (normaxis start) -- (normaxis end) +\draw[dashed] (ray origin) -- ($(normal through t1 start)!(ray origin)!(normal through t1 end)$); +\draw[dashed] (ray origin) -- ($(normal through t2 start)!(ray origin)!(normal through t2 end)$); + +% draw e, e+h and e-h distance indicators, and perpendicularity markers +\begin{scope}[color=blue] +%\draw[<->,shorten <=.7mm] (center) -- ($(normal through center start)!(t1)!(normal through center end)$) node[midway,left] {$h$}; +\draw[<->,shorten <=.7mm] (center) -- ($(normal through center start)!(ray origin)!(normal through center end)$) node[midway,left] {$e$}; +\draw[|<->|] ($(t1) + (1.5mm,0)$) -- ($(q1) + (1.5mm,0)$) node[midway,right] {$e-h_i$}; +\draw[|<->|] ($(t2) + (1.5mm,0)$) -- ($(q2) + (1.5mm,0)$) node[midway,right] {$e+h_i$}; +\end{scope} +\draw ($(q1) + (-1.2mm,1.2mm) - (2.5mm,0)$) -- ($(q1) + (-1.2mm,1.2mm)$) -- ($(q1) + (-1.2mm,1.2mm) + (0,2.5mm)$); +\draw ($(q2) + (-1.2mm,1.2mm) - (2.5mm,0)$) -- ($(q2) + (-1.2mm,1.2mm)$) -- ($(q2) + (-1.2mm,1.2mm) + (0,2.5mm)$); + +\end{scope} +\end{tikzpicture} + +\caption{A visual representation of how the distances between $\mathbf{o}$ and $\mathbf{t}_1$ and $\mathbf{t}_2$ are computed in the two-dimensional case, for a generic slab $i \in \{u,v\}$ with normal vector $\mathbf{a}_i$ and half-size $h_i$.} +\label{fig:visual_2d} +\end{figure} + +In a right-angled triangle, per definition of the cosine, the hypotenuse's length is $\cos \theta$ times the length of the adjacent side: + +\begin{center} +\begin{tikzpicture}[scale=1] +\draw (0,0) -- (3,0) node[midway,below] {$x$} -- (3,2) -- (0,0) node[midway,sloped,above] {$x \cos \theta$}; +\draw (0,0) -- (5mm,0) arc (0:33:5mm) node[right,xshift=1mm,yshift=-.5mm] {$\theta$}; +\begin{scope}[xshift=-1.2mm,yshift=1.2mm] +\draw ($(3,0) - (2.5mm,0)$) -- (3,0) -- ($(3,0) + (0,2.5mm)$); +\end{scope} +\end{tikzpicture} +\end{center} + +Thus, looking at the right-angled triangles $\Delta \mathbf{o} q_1 t_1$ and $\Delta \mathbf{o} q_2 t_2$ in Figure \ref{fig:visual_2d}, we find that: +\begin{eqnarray*} +\vectornorm{\mathbf{o} - \mathbf{t_1}} & = & \frac{e - h_i}{\cos \theta}\\ +\vectornorm{\mathbf{o} - \mathbf{t_2}} & = & \frac{e + h_i}{\cos \theta}\\ +\end{eqnarray*} + +\section{Degenerate cases} + +It's prudent to consider what happens for the degenerate case of testing a ray for intersections against an OBB that has no size in one or more dimensions. Figure \ref{fig:degenerate_2d_1dim} depicts the degenerate variant of the 2D case seen earlier, where the box now has a null size in the $u$ dimension. + +\begin{figure}[ht] +\centering +\begin{tikzpicture} +\tikzstyle{empty}=[inner sep=0pt] +\tikzstyle{dot}=[shape=circle,draw,fill=black,inner sep=0pt,minimum size=1mm] + +% two rays +\node[dot] (ray 1 origin) at (-5,-2) [label=below:{$\mathbf{o}_1$}] {}; +\node[empty] (ray 1 direction) at (0.861934, 0.50702) {}; +\node[empty] (ray 1 end) at ($(ray 1 origin) + 12*(ray 1 direction)$) {}; +%\node[dot] (ray 2 origin) at (-5,-6) [label=below:{$\mathbf{o}_2$}] {}; +%\node[empty] (ray 2 direction) at (0.861934, 0.50702) {}; +%\node[empty] (ray 2 end) at ($(ray 2 origin) + 12*(ray 2 direction)$) {}; + +\begin{scope}[rotate=-15] +%\draw[help lines] (-6,-4) grid (5,4); + +% box points (top right, bottom right, etc.) +\node[empty] (box tr) at (0,2) {}; +\node[empty] (box br) at (0,-2) {}; +\node[empty] (box bl) at (0,-2) {}; +\node[empty] (box tl) at (0,2) {}; +% slab points (same as box, but a bit wider) +\node[empty] (slab tl) at (-5.5,2) {}; +\node[empty] (slab bl) at (-5.5,-2) {}; +\node[empty] (slab tr) at (5.5,2) {}; +\node[empty] (slab br) at (5.5,-2) {}; + +\node[empty] (center) at (0,0) {}; + +% draw the slab background and the box +\draw[fill=gray!10,fill opacity=80,draw=green!0] (slab bl) rectangle (box tl); +\draw[fill=gray!10,fill opacity=80,draw=green!0] (box br) rectangle (slab tr); +\draw[dashed] (slab tl) -- (box tl); +\draw[dashed] (box tr) -- (slab tr); +\draw[dashed] (box br) -- (slab br); +\draw[dashed] (slab bl) -- (box bl); +\draw (box bl) rectangle (box tr); + +% draw rays +\draw[->] (ray 1 origin) -- (ray 1 end); +%\draw[->] (ray 2 origin) -- (ray 2 end); +\draw[->] (ray 1 origin) -- +($(ray 1 direction)$) node[midway,below,xshift=2mm,yshift=1mm] {$\mathbf{d}_1$}; +%\draw[->] (ray 2 origin) -- +($(ray 2 direction)$) node[midway,below,xshift=2mm,yshift=1mm] {$\mathbf{d}_2$}; + +% draw basis vectors +\begin{scope}[xshift=-7cm] +\draw[->] (0,0) -- (1,0) node[midway,below] {$\mathbf{a}_u$}; +\draw[->] (0,0) -- (0,1) node[midway,left] {$\mathbf{a}_v$}; +\end{scope} + +% draw node points +\filldraw[fill=black] (center) circle (1.5pt) node[below right,xshift=-1mm] {$\mathbf{a}_c$}; +\end{scope} +\end{tikzpicture} + +\caption{Degenerate 2D case with null size in the $u$ dimension.} +\label{fig:degenerate_2d_1dim} +\end{figure} + +In the method seen above, the only prerequisites to computing the distances between the ray origin and its intersection points with the slab are $\cos \theta$ and $e \pm h_i$. In the degenerate case, $h_u$ is 0, and so both intersection points will be correctly found at $e / \cos \theta$. None of the other terms depend upon the size of the box along the dimension at hand, and hence remain unaffected. However, they do depend on the degenerate dimension's normal vector remaining well-defined and non-null. + +%\bibliographystyle{plainnat-keepcase} +\bibliographystyle{plainnat} +\bibliography{ray_intersect} + +\end{document}