00001 #include <gra/camera/PerspProj.h> 00002 00003 using namespace gra; 00004 00005 PerspProj::PerspProj(double left, 00006 double right, 00007 double bottom, 00008 double top, 00009 double nr, 00010 double fr) 00011 : Projection(left, right, bottom, top, nr, fr) 00012 { 00013 if (_left == _right) { 00014 cerr << "PerspProj(): invalid left and right clipping planes;" << endl; 00015 cerr << " switching to -1, 1" << endl; 00016 _left = -1.0; 00017 _right = 1.0; 00018 } 00019 00020 if (_bottom == _top) { 00021 cerr << "PerspProj(): invalid bottom and top clipping planes;" << endl; 00022 cerr << " switching to -1, 1" << endl; 00023 _bottom = -1.0; 00024 _top = 1.0; 00025 } 00026 00027 if (_near == _far) { 00028 cerr << "PerspProj(): invalid near and far clipping planes;" << endl; 00029 cerr << " switching to 1, 10" << endl; 00030 _near = 1.0; 00031 _far = 10.0; 00032 } 00033 00034 if (_near <= 0.0) { 00035 cerr << "PerspProj(): near clipping plane mus be positive;" << endl; 00036 cerr << " switching to 1" << endl; 00037 _near = 1.0; 00038 } 00039 00040 if (_far <= 0.0) { 00041 cerr << "PerspProj(): far clipping plane mus be positive;" << endl; 00042 cerr << " switching to 10" << endl; 00043 _far = 10.0; 00044 } 00045 00046 float rl = _right - _left; 00047 float tb = _top - _bottom; 00048 float fn = _far - _near; 00049 float n2 = 2 * _near; 00050 00051 _projMat.set(n2/rl, 0.0, (_right+_left)/rl, 0.0, 00052 0.0, n2/tb, (_top+_bottom)/tb, 0.0, 00053 0.0, 0.0, (-_far-_near)/fn, -(n2*_far)/fn, 00054 0.0, 0.0, -1.0, 0.0); 00055 } 00056 00057 Projection* PerspProj::clone() const 00058 { 00059 return new PerspProj(*this); 00060 } 00061 00062 Vector3 PerspProj::getProjectionDirection(const Vector2& point) 00063 { 00064 Vector3 pdir(_left + point.x, _bottom + point.y, -_near); 00065 pdir.normalize(); 00066 return pdir; 00067 }