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
00026 #include "stdafx.h"
00027 #include "cameras/environment.h"
00028 #include "paramset.h"
00029 #include "sampler.h"
00030
00031
00032 float EnvironmentCamera::GenerateRay(const CameraSample &sample,
00033 Ray *ray) const {
00034 float time = Lerp(sample.time, shutterOpen, shutterClose);
00035
00036 float theta = M_PI * sample.imageY / film->yResolution;
00037 float phi = 2 * M_PI * sample.imageX / film->xResolution;
00038 Vector dir(sinf(theta) * cosf(phi), cosf(theta),
00039 sinf(theta) * sinf(phi));
00040 *ray = Ray(Point(0,0,0), dir, 0.f, INFINITY, time);
00041 CameraToWorld(*ray, ray);
00042 return 1.f;
00043 }
00044
00045
00046 EnvironmentCamera *CreateEnvironmentCamera(const ParamSet ¶ms,
00047 const AnimatedTransform &cam2world, Film *film) {
00048
00049 float shutteropen = params.FindOneFloat("shutteropen", 0.f);
00050 float shutterclose = params.FindOneFloat("shutterclose", 1.f);
00051 float lensradius = params.FindOneFloat("lensradius", 0.f);
00052 float focaldistance = params.FindOneFloat("focaldistance", 1e30f);
00053 float frame = params.FindOneFloat("frameaspectratio",
00054 float(film->xResolution)/float(film->yResolution));
00055 float screen[4];
00056 if (frame > 1.f) {
00057 screen[0] = -frame;
00058 screen[1] = frame;
00059 screen[2] = -1.f;
00060 screen[3] = 1.f;
00061 }
00062 else {
00063 screen[0] = -1.f;
00064 screen[1] = 1.f;
00065 screen[2] = -1.f / frame;
00066 screen[3] = 1.f / frame;
00067 }
00068 int swi;
00069 const float *sw = params.FindFloat("screenwindow", &swi);
00070 if (sw && swi == 4)
00071 memcpy(screen, sw, 4*sizeof(float));
00072 (void) lensradius;
00073 (void) focaldistance;
00074 return new EnvironmentCamera(cam2world, shutteropen, shutterclose, film);
00075 }
00076
00077