#ifndef CAMERA_H #define CAMERA_H #include #include namespace vcg { template class ViewGL { public: void GetView(); void SetView(); Point3 Project(const Point3 &p) const; Point3 UnProject(const Point3 &p) const; Point3 ViewPoint(); Matrix44 proj; Matrix44 model; Matrix44 matrix; Matrix44 inverse; int viewport[4]; }; template void Camera::GetView() { glGetDoublev(GL_PROJECTION_MATRIX, (double *)&proj); glGetDoublev(GL_MODELVIEW_MATRIX, (double *)&model); glGetIntegerv(GL_VIEWPORT, viewport); proj.Transpose(); model.Transpose(); matrix.Import(proj * model); inverse = matrix; Invert(inverse); } template Point3 Camera::ViewPoint() { return inverse * Point3(0, 0, 0); /*Matrix44d model(model_matrix); model.Invert(); Point3d view = model * Point3d(0, 0, 0); return Point3(view[0], view[1], view[2]); */ } template Point3 Camera::Project(const Point3 &p) const { Point3 r; r = matrix * p; r[0] = (r[0]+1)*(viewport[2]/2.0)+viewport[0]; r[1] =(r[1]+1)*(viewport[3]/2.0)+viewport[1]; return r; /*double r[3]; gluProject(p[0], p[1], p[2], model_matrix, proj_matrix, viewport, &r[0], &r[1], &r[2]); return Point3((T)r[0], (T)r[1], (T)r[2]);*/ } template Point3 Camera::UnProject(const Point3 &p) const { Point3 s; s[0] = (p[0]- viewport[0])/ (viewport[2]/2.0) - 1; s[1] = (p[1]- viewport[1])/ (viewport[3]/2.0) - 1; s[2] = p[2]; s[1] = -s[1]; // pezza aggiunta per il tan2.... ????????????? s = inverse * s; return s; /*double r[3]; gluUnProject(p[0], p[1], p[2], model_matrix, proj_matrix, viewport, &r[0], &r[1], &r[2]); return Point3((T)r[0], (T)r[1], (T)r[2]);*/ } }//namespace #endif