00001 00005 #include "PinholeCamera.h" 00006 #include "Ray.h" 00007 #include "Math.h" 00008 #include <math.h> 00009 00010 PinholeCamera::PinholeCamera(const Point& eye, const Point& lookat, const Vector& up, 00011 double hfov) 00012 : eye(eye), lookat(lookat), up(up), hfov(hfov) 00013 { 00014 } 00015 00016 PinholeCamera::~PinholeCamera() 00017 { 00018 } 00019 00020 void PinholeCamera::preprocess(double aspect_ratio) 00021 { 00022 lookdir = lookat-eye; 00023 lookdir.normalize(); 00024 u = Cross(lookdir, up); 00025 v = Cross(u, lookdir); 00026 double ulen = tan(hfov/2.*M_PI/180.); 00027 u.normalize(); 00028 u *= ulen; 00029 double vlen = ulen/aspect_ratio; 00030 v.normalize(); 00031 v *= vlen; 00032 } 00033 00034 void PinholeCamera::makeRay(Ray& ray, const RenderContext& context, double x, double y) const 00035 { 00036 Vector direction = lookdir+u*x+v*y; 00037 direction.normalize(); 00038 ray = Ray(eye, direction); 00039 }