src/PerspectiveCamera.h

Go to the documentation of this file.
00001 #ifndef PERSPECTIVECAMERA_H
00002 #define PERSPECTIVECAMERA_H
00003 
00004 
00005 #include <cmath>
00006 
00007 #include "Camera.h"
00008 
00009 
00015 class PerspectiveCamera : public Camera
00016 {
00017 public:
00027     PerspectiveCamera(  Vec3f   pos,
00028                         Vec3f   dir,
00029                         Vec3f   up,
00030                         float   angle,
00031                         int     resX,
00032                         int     resY )
00033         : Camera(pos, resX, resY),
00034             mDir(dir),
00035             mUp(up),
00036             mAngle(angle * M_PI / 180.0f),
00037             mFocus(0.0f),
00038             mAspect(),
00039             mXAxis(),
00040             mYAxis()
00041     {
00042         mDir.normalize();
00043         mUp.normalize();
00044 
00045         mXAxis = mDir.cross(mUp).normal();
00046         mYAxis = mXAxis.cross(mDir).normal();
00047 
00048         mAspect = static_cast<float>(resX) / resY;
00049         mFocus = 1.f / tanf(mAngle / 2.0f);
00050     }
00051 
00054     virtual ~PerspectiveCamera()
00055     {}
00056 
00062     virtual Ray initRay(float x, float y)
00063     {
00064         Vec3f rdir  = (2.0f * ((x / mResX - .5f) * mAspect) * mXAxis)
00065                         + (2.0f * (y / mResY - .5f) * mYAxis)
00066                         + (mFocus * mDir);
00067         Ray ray;
00068         ray.init(mPos, rdir);
00069         return ray;
00070     }
00071 
00074     void setPos(Vec3f pos)
00075     {
00076         mPos = pos;
00077     }
00078 
00081     void setDir(Vec3f dir)
00082     {
00083         mDir = dir;
00084 
00085         mDir.normalize();
00086         mUp.normalize();
00087 
00088         mXAxis = mDir.cross(mUp).normal();
00089         mYAxis = mXAxis.cross(mDir).normal();
00090 
00091         mAspect = static_cast<float>(mResX) / mResY;
00092         mFocus = 1.f / tanf(mAngle / 2.0f);
00093     }
00094 
00097     void setUp(Vec3f up)
00098     {
00099         mUp = up;
00100 
00101         mDir.normalize();
00102         mUp.normalize();
00103 
00104         mXAxis = mDir.cross(mUp).normal();
00105         mYAxis = mXAxis.cross(mDir).normal();
00106 
00107         mAspect = static_cast<float>(mResX) / mResY;
00108         mFocus = 1.f / tanf(mAngle / 2.0f);
00109     }
00110 
00113     virtual const Vec3f & dir() const
00114     {
00115         return mDir;
00116     }
00117 
00120     const Vec3f & up() const
00121     {
00122         return mUp;
00123     }
00124 
00127     float angle() const
00128     {
00129         return mAngle / M_PI * 180.0f;
00130     }
00131 
00134     float aspect() const
00135     {
00136         return mAspect;
00137     }
00138 
00141     int depthSamples() const
00142     {
00143         return 1;
00144     }
00145 
00149     virtual const float focusDistance() const
00150     {
00151         return 1.0f;
00152     }
00153 
00157     virtual const float aperture() const
00158     {
00159         return 0.04;
00160     }
00161 
00165     void setDepthSamples(unsigned int) { };
00166 
00170     void setFocusDistance(float) { };
00171 
00175     void setAperture(float) { };
00176 
00177 
00181     void setSlowCorrect() { }
00182 
00186     void setFastIncorrect() { }
00187 
00188 private:
00190     Vec3f   mDir;
00191 
00193     Vec3f   mUp;
00194 
00196     float   mAngle;
00197 
00199     float   mFocus;
00200 
00202     float   mAspect;
00203 
00205     Vec3f   mXAxis;
00206 
00208     Vec3f   mYAxis;
00209 };
00210 
00211 #endif
00212 

Generated on Fri Feb 1 00:01:42 2008 for Grayfall by  doxygen 1.5.1