00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "camera.h"
00026 #include "film.h"
00027 #include "paramset.h"
00028
00029 class EnvironmentCamera : public Camera {
00030 public:
00031
00032 EnvironmentCamera(const Transform &world2cam, float hither,
00033 float yon, float sopen, float sclose, Film *film);
00034 float GenerateRay(const Sample &sample, Ray *) const;
00035 private:
00036
00037 Point rayOrigin;
00038 };
00039
00040 EnvironmentCamera::
00041 EnvironmentCamera(const Transform &world2cam,
00042 float hither, float yon, float sopen, float sclose,
00043 Film *film)
00044 : Camera(world2cam, hither, yon, sopen, sclose, film) {
00045 rayOrigin = CameraToWorld(Point(0,0,0));
00046 }
00047 float EnvironmentCamera::GenerateRay(const Sample &sample,
00048 Ray *ray) const {
00049 ray->o = rayOrigin;
00050
00051 float theta = M_PI * sample.imageY / film->yResolution;
00052 float phi = 2 * M_PI * sample.imageX / film->xResolution;
00053 Vector dir(sinf(theta) * cosf(phi), cosf(theta),
00054 sinf(theta) * sinf(phi));
00055 CameraToWorld(dir, &ray->d);
00056
00057 ray->time = Lerp(sample.time, ShutterOpen, ShutterClose);
00058 ray->mint = ClipHither;
00059 ray->maxt = ClipYon;
00060 return 1.f;
00061 }
00062 extern "C" DLLEXPORT Camera *CreateCamera(const ParamSet ¶ms,
00063 const Transform &world2cam, Film *film) {
00064
00065 float hither = max(1e-4f, params.FindOneFloat("hither", 1e-3f));
00066 float yon = min(params.FindOneFloat("yon", 1e30f), 1e30f);
00067 float shutteropen = params.FindOneFloat("shutteropen", 0.f);
00068 float shutterclose = params.FindOneFloat("shutterclose", 1.f);
00069 float lensradius = params.FindOneFloat("lensradius", 0.f);
00070 float focaldistance = params.FindOneFloat("focaldistance", 1e30f);
00071 float frame = params.FindOneFloat("frameaspectratio",
00072 float(film->xResolution)/float(film->yResolution));
00073 float screen[4];
00074 if (frame > 1.f) {
00075 screen[0] = -frame;
00076 screen[1] = frame;
00077 screen[2] = -1.f;
00078 screen[3] = 1.f;
00079 }
00080 else {
00081 screen[0] = -1.f;
00082 screen[1] = 1.f;
00083 screen[2] = -1.f / frame;
00084 screen[3] = 1.f / frame;
00085 }
00086 int swi;
00087 const float *sw = params.FindFloat("screenwindow", &swi);
00088 if (sw && swi == 4)
00089 memcpy(screen, sw, 4*sizeof(float));
00090 (void) lensradius;
00091 (void) focaldistance;
00092 return new EnvironmentCamera(world2cam, hither, yon,
00093 shutteropen, shutterclose, film);
00094 }