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