Text archives Help
- 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.