solution to assignment 2.2 b): surface normalsD
[MicroTrace.git] / Sphere.cxx
index 3c19afa..5706cc3 100644 (file)
@@ -1,7 +1,7 @@
 #include "Sphere.hxx"
 
 Sphere::Sphere(const Vec3f& center, float radius, Shader* shader)
-  : Primitive(shader), 
+  : Primitive(shader),
     m_center(center),
     m_radius(radius)
 {
@@ -20,12 +20,12 @@ Sphere::Intersect(Ray& ray)
 
   if( B*B-4*A*C < 0 )
     return false;
-  
+
   float root = sqrtf(B*B-4*A*C);
   float t = (-B-root)/(2.0f*A);
   if(t > ray.t())
     return false;
-      
+
   if( t < 1e-6 )
     {
       t = (-B+root)/(2.0f*A);
@@ -39,5 +39,16 @@ Sphere::Intersect(Ray& ray)
 Vec3f
 Sphere::GetNormal(Ray& ray)
 {
-  return Vec3f();
+  // We don't want to modify the ray (probably this is not needed, but I am
+  // too lazy to think about it now ...)
+  Ray tempRay = ray;
+
+  // Surface normal is the difference between intersection and center point
+  Intersect(tempRay);
+  // intersection
+  Vec3f i = tempRay.origin() + tempRay.direction() * tempRay.t();
+  // normal
+  Vec3f n = (i - m_center);
+  n.normalize();
+  return n;
 }
This page took 0.027135 seconds and 4 git commands to generate.