void MeshRenderer :: setPose(const Pose3D& pose, float* arg_near_plane, float* arg_far_plane) { VertexBufferObject& vbo = m_vertex_buffer_object; pose.cvCameraTransform().copyTo(vbo.model_view_matrix); // Transpose the matrix for OpenGL column-major. vbo.model_view_matrix = vbo.model_view_matrix.t(); if (!(arg_near_plane && arg_far_plane)) { estimateOptimalPlanes(pose, &m_last_near_plane, &m_last_far_plane); } else { m_last_near_plane = *arg_near_plane; m_last_far_plane = *arg_far_plane; } m_pbuffer->makeCurrent(); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); cv::Vec3f euler_angles = pose.cvEulerRotation(); glTranslatef(pose.cvTranslation()[0], pose.cvTranslation()[1], pose.cvTranslation()[2]); glRotatef(euler_angles[2]*180.0/M_PI, 0, 0, 1); glRotatef(euler_angles[1]*180.0/M_PI, 0, 1, 0); glRotatef(euler_angles[0]*180.0/M_PI, 1, 0, 0); glMatrixMode (GL_PROJECTION); glLoadIdentity (); double dx = pose.imageCenterX() - (m_pbuffer->width() / 2.0); double dy = pose.imageCenterY() - (m_pbuffer->height() / 2.0); glViewport(dx, -dy, m_pbuffer->width(), m_pbuffer->height()); if (pose.isOrthographic()) { ntk_dbg_print(pose.focalX()/2, 0); ntk_dbg_print(pose.focalY()/2, 0); glOrtho(-pose.focalX()/2, pose.focalX()/2, -pose.focalY()/2, pose.focalY()/2, m_last_near_plane, m_last_far_plane); } else { double fov = (180.0/M_PI) * 2.0*atan(m_pbuffer->height()/(2.0*pose.focalY())); // double fov2 = (180.0/M_PI) * 2.0*atan(image.cols/(2.0*pose.focalX())); // ntk_dbg_print(fov2, 2); // gluPerspective(fov2, double(image.rows)/image.cols, near_plane, far_plane); gluPerspective(fov, double(m_pbuffer->width())/m_pbuffer->height(), m_last_near_plane, m_last_far_plane); } glMatrixMode (GL_MODELVIEW); }
void MeshRenderer :: computeProjectionMatrix(cv::Mat4b& image, const Pose3D& pose) { double near_plane, far_plane; estimateOptimalPlanes(pose, &near_plane, &far_plane); ntk_dbg_print(near_plane, 2); ntk_dbg_print(far_plane, 2); m_last_near_plane = near_plane; m_last_far_plane = far_plane; m_pbuffer->makeCurrent(); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); cv::Vec3f euler_angles = pose.cvEulerRotation(); glTranslatef(pose.cvTranslation()[0], pose.cvTranslation()[1], pose.cvTranslation()[2]); glRotatef(euler_angles[2]*180.0/M_PI, 0, 0, 1); glRotatef(euler_angles[1]*180.0/M_PI, 0, 1, 0); glRotatef(euler_angles[0]*180.0/M_PI, 1, 0, 0); glMatrixMode (GL_PROJECTION); glLoadIdentity (); double dx = pose.imageCenterX() - (image.cols / 2.0); double dy = pose.imageCenterY() - (image.rows / 2.0); glViewport(dx, -dy, image.cols, image.rows); //glViewport(0, 0, image.cols, image.rows); if (pose.isOrthographic()) { gluOrtho2D(-pose.focalX()/2, pose.focalX()/2, -pose.focalY()/2, pose.focalY()/2); } else { double fov = (180.0/M_PI) * 2.0*atan(image.rows/(2.0*pose.focalY())); // double fov2 = (180.0/M_PI) * 2.0*atan(image.cols/(2.0*pose.focalX())); // ntk_dbg_print(fov2, 2); // gluPerspective(fov2, double(image.rows)/image.cols, near_plane, far_plane); gluPerspective(fov, double(image.cols)/image.rows, near_plane, far_plane); } glMatrixMode (GL_MODELVIEW); }