vmmlib  1.8.0
Templatized C++ vector and matrix math library
 All Classes Namespaces Files Functions Variables Typedefs Pages
intersection.hpp
1 /*
2  * Copyright (c) 2006-2014, Visualization and Multimedia Lab,
3  * University of Zurich <http://vmml.ifi.uzh.ch>,
4  * Eyescale Software GmbH,
5  * Blue Brain Project, EPFL
6  *
7  * This file is part of VMMLib <https://github.com/VMML/vmmlib/>
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * Redistributions of source code must retain the above copyright notice, this
13  * list of conditions and the following disclaimer. Redistributions in binary
14  * form must reproduce the above copyright notice, this list of conditions and
15  * the following disclaimer in the documentation and/or other materials provided
16  * with the distribution. Neither the name of the Visualization and Multimedia
17  * Lab, University of Zurich nor the names of its contributors may be used to
18  * endorse or promote products derived from this software without specific prior
19  * written permission.
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /* @author Jafet Villafranca
34  *
35  * Implements ray-object intersection, storing the ray parameters as attributes
36  * and implementing intersection tests against different types of objects
37  * (e.g. sphere)
38  */
39 
40 #ifndef __VMML__INTERSECTION__HPP__
41 #define __VMML__INTERSECTION__HPP__
42 
43 #include <vmmlib/vector.hpp>
44 
45 namespace vmml
46 {
47 template< typename T > class intersection
48 {
49 public:
50  typedef vector< 3, T > vec3;
51  typedef vector< 4, T > vec4;
52 
59  intersection( const vec3& origin, const vec3& direction )
60  : _origin ( origin )
61  , _direction ( vmml::normalize( direction ))
62  {}
63  ~intersection() {}
64 
75  bool test_sphere( const vec4& sphere, T& t ) const;
76 
77 private:
78  const vec3 _origin;
79  const vec3 _direction;
80 
81 }; // class intersection
82 
83 
84 template< typename T >
85 bool
86 intersection< T >::test_sphere( const vec4& sphere, T& t ) const
87 {
88  const vec3 center = vec3(sphere.x(), sphere.y(), sphere.z());
89  const T radius = sphere.w();
90 
91  const vec3 centerVec = center - _origin;
92  const T vecProjection = centerVec.dot(_direction);
93 
94  const T sqDistance = centerVec.squared_length();
95  const T sqRadius = radius * radius;
96 
98  if( vecProjection < 0 && sqDistance > sqRadius )
99  return false;
100 
102  const T sqCenterToProj = sqDistance - vecProjection * vecProjection;
103 
104  if( sqCenterToProj > sqRadius )
105  return false;
106 
108  const T distSurface = sqrt( sqRadius - sqCenterToProj );
109 
110  if(sqDistance > sqRadius)
111  t = vecProjection - distSurface;
112  else
113  t = vecProjection + distSurface;
114 
115  return true;
116 }
117 
118 
119 } // namespace vmml
120 
121 #endif
intersection(const vec3 &origin, const vec3 &direction)
Constructors.
bool test_sphere(const vec4 &sphere, T &t) const
Ray Sphere Intersection - Optimized solution "Real-time Rendering 3rd Edition".