Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1735 - trunk/Model/Cameras


Chronological Thread 
  • From: arobison@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1735 - trunk/Model/Cameras
  • Date: Sat, 22 Sep 2007 14:01:08 -0600 (MDT)

Author: arobison
Date: Sat Sep 22 14:01:06 2007
New Revision: 1735

Modified:
   trunk/Model/Cameras/ThinLensCamera.cc
Log:
Bug fix to thin lens camera.  Depth of field and focus is now correct.
FOV is maintained when changing focal length.


Modified: trunk/Model/Cameras/ThinLensCamera.cc
==============================================================================
--- trunk/Model/Cameras/ThinLensCamera.cc       (original)
+++ trunk/Model/Cameras/ThinLensCamera.cc       Sat Sep 22 14:01:06 2007
@@ -145,9 +145,9 @@
   u=Cross(v, direction);
   u.normalize();
 
-  height=tan(vfov*(Real)(0.5*M_PI/180.0));
+  height=focal_length*tan(vfov*(Real)(0.5*M_PI/180.0));
   u*=height;
-  width=tan(hfov*(Real)(0.5*M_PI/180.0));
+  width=focal_length*tan(hfov*(Real)(0.5*M_PI/180.0));
   v*=width;
 
 }
@@ -174,9 +174,10 @@
       Real theta = 2.0 * M_PI * lens_coord_x.get(i);
       Real r = radius * SCIRun::Sqrt( lens_coord_y.get(i) );
     
-      Vector origin = eye + r*Cos(theta)*u + r*Sin(theta)*v;
+      Vector origin = r*Cos(theta)*u + r*Sin(theta)*v;
+      Vector on_film = imageX*v+imageY*u+direction*focal_length;
     
-      rays.setRay(i, origin, imageX*v+imageY*u+direction*focal_length);
+      rays.setRay(i, eye+origin, on_film-origin);
     }
   } else {
     int i = rays.rayBegin;
@@ -187,9 +188,10 @@
       Real theta = 2.0 * M_PI * lens_coord_x.get(i);
       Real r = radius * SCIRun::Sqrt( lens_coord_y.get(i) );
       
-      Vector origin = eye + r*Cos(theta)*u + r*Sin(theta)*v;
+      Vector origin = r*Cos(theta)*u + r*Sin(theta)*v;
+      Vector on_film = imageX*v+imageY*u+direction*focal_length;
     
-      rays.setRay(i, origin, imageX*v+imageY*u+direction*focal_length);
+      rays.setRay(i, eye+origin, on_film-origin);
     }
     for(i=e;i<rays.rayEnd;i++) {
       Real imageX = rays.getImageCoordinates(i, 0);
@@ -198,9 +200,10 @@
       Real theta = 2.0 * M_PI * lens_coord_x.get(i);
       Real r = radius * SCIRun::Sqrt( lens_coord_y.get(i) );
     
-      Vector origin = eye + r*Cos(theta)*u + r*Sin(theta)*v;
+      Vector origin = r*Cos(theta)*u + r*Sin(theta)*v;
+      Vector on_film = imageX*v+imageY*u+direction*focal_length;
     
-      rays.setRay(i, origin, imageX*v+imageY*u+direction*focal_length);
+      rays.setRay(i, eye+origin, on_film-origin);
     }
 
     RayPacketData* data = rays.data;
@@ -243,30 +246,30 @@
       rSinTheta = mul4(r4, rSinTheta);
 #endif
 
-      const sse_t origin_x = add4( add4( eyex, mul4(rCosTheta, u0) ),
+      const sse_t origin_x = add4( mul4(rCosTheta, u0),
                                    mul4(rSinTheta, v0));
-      const sse_t origin_y = add4( add4( eyey, mul4(rCosTheta, u1) ),
+      const sse_t origin_y = add4( mul4(rCosTheta, u1),
                                    mul4(rSinTheta, v1));
-      const sse_t origin_z = add4( add4( eyez, mul4(rCosTheta, u2) ),
+      const sse_t origin_z = add4( mul4(rCosTheta, u2),
                                    mul4(rSinTheta, v2));
 
-      store44(&data->origin[0][i], origin_x);
-      store44(&data->origin[1][i], origin_y);
-      store44(&data->origin[2][i], origin_z);
+      store44(&data->origin[0][i], add4(eyex, origin_x));
+      store44(&data->origin[1][i], add4(eyey, origin_y));
+      store44(&data->origin[2][i], add4(eyez, origin_z));
 
-      const sse_t direction_x = add4( add4( mul4( imageX, v0 ),
+      const sse_t onfilm_x = add4( add4( mul4( imageX, v0 ),
                                             mul4( imageY, u0 ) ),
                                       mul4( dirx, focal4 ) );
-      const sse_t direction_y = add4( add4( mul4( imageX, v1 ),
+      const sse_t onfilm_y = add4( add4( mul4( imageX, v1 ),
                                             mul4( imageY, u1 ) ),
                                       mul4( diry, focal4 ) );
-      const sse_t direction_z = add4( add4( mul4( imageX, v2 ),
+      const sse_t onfilm_z = add4( add4( mul4( imageX, v2 ),
                                             mul4( imageY, u2 ) ),
                                       mul4( dirz, focal4 ) );
 
-      store44(&data->direction[0][i], direction_x);
-      store44(&data->direction[1][i], direction_y);
-      store44(&data->direction[2][i], direction_z);
+      store44(&data->direction[0][i], sub4(onfilm_x, origin_x));
+      store44(&data->direction[1][i], sub4(onfilm_y, origin_y));
+      store44(&data->direction[2][i], sub4(onfilm_z, origin_z));
     }
   }
 #else
@@ -277,9 +280,10 @@
     Real theta = 2.0 * M_PI * lens_coord_x.get(i);
     Real r = radius * SCIRun::Sqrt( lens_coord_y.get(i) );
     
-    Vector origin = eye + r*Cos(theta)*u + r*Sin(theta)*v;
+    Vector origin = r*Cos(theta)*u + r*Sin(theta)*v;
+    Vector on_film = imageX*v+imageY*u+direction*focal_length;
     
-    rays.setRay(i, origin, imageX*v+imageY*u+direction*focal_length);
+    rays.setRay(i, eye+origin, on_film-origin);
   }
 #endif
 }




  • [Manta] r1735 - trunk/Model/Cameras, arobison, 09/22/2007

Archive powered by MHonArc 2.6.16.

Top of page