Projection.cc

Go to the documentation of this file.
00001 #include <gra/camera/Projection.h>
00002 
00003 using namespace gra;
00004 
00005 void Projection::_set_clipping_planes(double left,
00006                                       double right,
00007                                       double bottom,
00008                                       double top,
00009                                       double nr,
00010                                       double fr)
00011 {
00012     _left   = left;
00013     _right  = right;
00014     _top    = top;
00015     _bottom = bottom;
00016     _near   = nr;
00017     _far    = fr;
00018 }
00019 
00020 
00021 
00022 
00023 Projection::Projection(double left,
00024                        double right,
00025                        double bottom,
00026                        double top,
00027                        double nr,
00028                        double fr)
00029 {
00030     _set_clipping_planes(left, right, bottom, top, nr, fr);
00031     _projMat.setIdentity();
00032 }
00033 
00034 Projection::Projection(const Projection& proj)
00035 {
00036     set(proj);
00037 }
00038 
00039 void Projection::set(const Projection& proj)
00040 {
00041     _set_clipping_planes(proj._left, proj._right, proj._bottom,
00042                          proj._top, proj._near, proj._far);
00043     _projMat.set(proj._projMat);
00044 }
00045 
00046 Vector4 Projection::project(const Vector4& point) const
00047 {
00048     Vector4 ret(point);
00049     _projMat.transform(ret);
00050     return ret;
00051 }
00052 
00053 Vector3 Projection::project(const Vector3& point) const
00054 {
00055     Vector4 aux(point.x, point.y, point.z, 1.0);
00056     _projMat.transform(aux);
00057     return Vector3(aux.x / aux.w, aux.y / aux.w, aux.z / aux.w);
00058 }
00059 
00060 bool Projection::projectAndClip(const Vector4& point, Vector4* res) const
00061 {
00062     if (res) {
00063         res->set(project(point));
00064         return clip(*res);
00065     } else {
00066         Vector4 a(project(point));
00067         return clip(a);
00068     }
00069 }
00070 
00071 bool Projection::projectAndClip(const Vector3& point, Vector3* res) const
00072 {
00073     if (res) {
00074         res->set(project(point));
00075         return clip(*res);
00076     } else {
00077         Vector3 a(project(point));
00078         return clip(a);
00079     }
00080 }
00081 
00082 bool Projection::clip(const Vector4& v) const
00083 {
00084     register float xw = v.x * v.w;
00085     register float yw = v.y * v.w;
00086     return (xw > _left && xw < _right && yw > _bottom && yw < _top);
00087 }
00088 
00089 bool Projection::clip(const Vector3& v) const
00090 {
00091     return (v.x > _left && v.x < _right && v.y > _bottom && v.y < _top);
00092 }
00093 
00094 bool Projection::projectToPlane(const Vector3& point3, Vector2& point2) const
00095 {
00096     Vector3 aux;
00097     bool inside = projectAndClip(point3, &aux);
00098 
00099     point2.x = (aux.x - _left) / (_right - _left);
00100     point2.y = (aux.y - _bottom) / (_top - _bottom);
00101 
00102     return inside;
00103 }
00104 
00105 void Projection::getProjectionArea(Vector3& bottom_left,
00106                                    Vector3& top_left,
00107                                    Vector3& top_right,
00108                                    Vector3& bottom_right) const
00109 {
00110     bottom_left.set(_left, _bottom, -_near);
00111     top_left.set(_left, _top, -_near);
00112     top_right.set(_right, _top, -_near);
00113     bottom_right.set(_right, _bottom, -_near);
00114 }

Generated on Tue Nov 21 15:11:42 2006 for gra by  doxygen 1.4.6