17 #if MRPT_HAS_OPENGL_GLUT 24 #include <GLUT/glut.h> 25 #include <OpenGL/gl.h> 26 #include <OpenGL/glu.h> 31 #ifdef HAVE_FREEGLUT_EXT_H 32 #include <GL/freeglut_ext.h> 35 #endif // MRPT_HAS_OPENGL_GLUT 47 #if defined(MRPT_OS_LINUX) 50 if (!::getenv(
"MESA_GL_VERSION_OVERRIDE"))
52 ::putenv(
"MESA_GL_VERSION_OVERRIDE=3.3");
60 if (m_openGLScene) m_openGLScene->unloadShaders();
74 float zoom =
params.cameraZoomDistance * exp(0.01f * (y - m_mouseClickY));
75 if (zoom <= m_minZoom || (m_maxZoom != -1.0f && m_maxZoom <= zoom))
return;
76 params.cameraZoomDistance = zoom;
77 if (
params.cameraZoomDistance < 0.01f)
params.cameraZoomDistance = 0.01f;
79 float Az = -0.05f * (x - m_mouseClickX);
80 float D = 0.001f *
params.cameraZoomDistance;
81 params.cameraPointingZ += D * Az;
86 float zoom =
params.cameraZoomDistance * (1 - 0.03f * (delta / 120.0f));
87 if (zoom <= m_minZoom || (m_maxZoom != -1.0f && m_maxZoom <= zoom))
return;
89 params.cameraZoomDistance = zoom;
94 const float dis = max(0.01f, (
params.cameraZoomDistance));
105 float A_AzimuthDeg = -SENSIBILITY_DEG_PER_PIXEL * (x - m_mouseClickX);
106 params.cameraAzimuthDeg += A_AzimuthDeg;
108 float A_ElevationDeg = SENSIBILITY_DEG_PER_PIXEL * (y - m_mouseClickY);
109 params.setElevationDeg(
params.cameraElevationDeg + A_ElevationDeg);
124 params.cameraAzimuthDeg -= 0.2f * (x - m_mouseClickX);
126 params.cameraElevationDeg + 0.2f * (y - m_mouseClickY));
137 #if MRPT_HAS_OPENGL_GLUT 138 if (w == -1 || h == -1)
return;
140 glViewport(0, 0, (GLint)w, (GLint)h);
146 #if MRPT_HAS_OPENGL_GLUT 147 glClearColor(clearColorR, clearColorG, clearColorB, clearColorA);
153 float Ay = -(x - m_mouseClickX);
154 float Ax = -(y - m_mouseClickY);
155 float D = 0.001f *
params.cameraZoomDistance;
164 return m_cameraParams;
169 return m_cameraParams;
179 return m_cameraParams.cameraZoomDistance;
184 m_cameraParams.cameraZoomDistance = zoom;
190 m_cameraParams.cameraPointingX, m_cameraParams.cameraPointingY,
191 m_cameraParams.cameraPointingZ);
205 m_cameraParams.cameraAzimuthDeg = ang;
210 m_cameraParams.cameraElevationDeg = ang;
215 return m_cameraParams.cameraAzimuthDeg;
220 return m_cameraParams.cameraElevationDeg;
225 m_cameraParams.cameraIsProjective = is;
230 return m_cameraParams.cameraIsProjective;
249 m_openGLScene = scene;
254 m_cameraParams.cameraPointingX = pointX;
255 m_cameraParams.cameraPointingY = pointY;
256 m_cameraParams.cameraPointingZ = pointZ;
261 return m_cameraParams.cameraPointingX;
266 return m_cameraParams.cameraPointingY;
271 return m_cameraParams.cameraPointingZ;
276 #if MRPT_HAS_OPENGL_GLUT 284 CHECK_OPENGL_ERROR();
287 glEnable(GL_DEPTH_TEST);
288 CHECK_OPENGL_ERROR();
291 resizeViewport((GLsizei)width, (GLsizei)height);
299 if (!useCameraFromScene)
305 "Fatal error: there is no 'main' viewport in the 3D " 310 updateCameraParams(cam);
316 m_openGLScene->render();
325 CHECK_OPENGL_ERROR();
329 catch (
const std::exception& e)
331 const std::string err_msg =
332 std::string(
"[CGLCanvasBase::Render] Exception:\n") +
334 std::cerr << err_msg;
335 renderError(err_msg);
346 cameraElevationDeg = deg;
348 if (cameraElevationDeg < -90.0f)
349 cameraElevationDeg = -90.0f;
350 else if (cameraElevationDeg > 90.0f)
351 cameraElevationDeg = 90.0f;
356 std::cerr <<
"[CGlCanvasBaseHeadless::renderError] Error:" << e
float getCameraPointingX() const
Returns the x pointing of the camera See also setCameraPointing(float, float, float) ...
double Tac() noexcept
Stops the stopwatch.
virtual void setCameraProjective(bool is)
float getClearColorR() const
void updateOrbitCamera(CamaraParams ¶ms, int x, int y) const
This function for the mouse event It gets a reference to CamaraParams, x, y and updates the elevation...
#define THROW_EXCEPTION(msg)
CamaraParams cameraParams() const
Returns a copy of CamaraParams See also getRefCameraParams(), setCameraParams(const CamaraParams &) ...
void setElevationDeg(float deg)
A high-performance stopwatch, with typical resolution of nanoseconds.
void setProjectiveModel(bool v=true)
Enable/Disable projective mode (vs.
void setMaximumZoom(float zoom)
Sets the maximum of the zoom See also setMinimumZoom(float)
float getZoomDistance() const
Returns a zoom See also setZoomDistance(float)
mrpt::vision::TStereoCalibParams params
virtual void setCameraParams(const CamaraParams ¶ms)
Sets the CamaraParams See also cameraParams(), getRefCameraParams()
void resizeViewport(int w, int h)
Calls the glViewport function.
const CamaraParams & getRefCameraParams() const
Returns a reference to CamaraParams See also cameraParams(), setCameraParams(const CamaraParams &) ...
void setMousePos(int x, int y)
Saves the click position of the mouse See also setMouseClicked(bool)
virtual void setElevationDegrees(float ang)
Saves the degrees of the elevation camera See also getElevationDegrees()
void setZoomDistance(float z)
mrpt::system::CTicTac CTicTac
void setAzimuthDegrees(float ang)
virtual void renderError(const std::string &e) override
void setOpenGLSceneRef(mrpt::opengl::COpenGLScene::Ptr scene)
virtual void setAzimuthDegrees(float ang)
Saves the degrees of the azimuth camera See also getAzimuthDegrees()
virtual double renderCanvas(int width=-1, int height=-1)
constexpr double DEG2RAD(const double x)
Degrees to radians.
virtual void setCameraPointing(float pointX, float pointY, float pointZ)
Saves the pointing of the camera See also getCameraPointingX(), getCameraPointingY(), getCameraPointingZ()
void clearColors()
Calls the glClearColor function See also setClearColors(float, float, float, float) ...
void setProjectiveFOVdeg(float ang)
Vertical field-of-View in degs, only when projectiveModel=true (default=30 deg).
float getCameraPointingZ() const
Returns the z pointing of the camera See also setCameraPointing(float, float, float) ...
virtual void setCameraFOV(float FOV)
void setClearColors(float r, float g, float b, float a=1.0f)
Sets the RGBA colors for glClearColor See also clearColors(), getClearColorR(), getClearColorG(),getClearColorB(), getClearColorA()
float getClearColorB() const
virtual void setZoomDistance(float zoom)
Saves camera zooming See also getZoomDistance()
bool getUseCameraFromScene() const
See also void setUseCameraFromScene(bool)
float getAzimuthDegrees() const
Returns a azimuth degrees See also setAzimuthDegrees(float)
float getCameraPointingY() const
Returns the y pointing of the camera See also setCameraPointing(float, float, float) ...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void setElevationDegrees(float ang)
void setMouseClicked(bool is)
Sets the property mouseClicked By default, this property is false.
void updateLastPos(int x, int y)
Sets the last mouse position.
float getElevationDegrees() const
Returns a elevation degrees See also setElevationDegrees(float)
void updateRotate(CamaraParams ¶ms, int x, int y) const
This function for the mouse event It gets a reference to CamaraParams, x, y and updates the elevation...
void setMinimumZoom(float zoom)
Sets the minimum of the zoom See also setMaximumZoom(float)
The namespace for 3D scene representation and rendering.
std::string exception_to_str(const std::exception &e)
Builds a nice textual representation of a nested exception, which if generated using MRPT macros (THR...
float getClearColorG() const
void setUseCameraFromScene(bool is)
If set to true (default=false), the cameraPointingX,...
Classes for creating GUI windows for 2D and 3D visualization.
bool isCameraProjective() const
void Tic() noexcept
Starts the stopwatch.
A camera: if added to a scene, the viewpoint defined by this camera will be used instead of the camer...
static float SENSIBILITY_DEG_PER_PIXEL
void updatePan(CamaraParams ¶ms, int x, int y) const
This function for the mouse event It gets a reference to CamaraParams, x, y and updates the pointing ...
mrpt::opengl::CCamera & updateCameraParams(mrpt::opengl::CCamera &cam) const
This function gets a reference to mrpt::opengl::CCamera and updates the camera parameters(pointing, zoom, azimuth, elevation, IsProjective, FOV)
float getClearColorA() const
void updateZoom(CamaraParams ¶ms, int x, int y) const
This function for the mouse event It gets a reference to CamaraParams, x, y and updates the zoom of t...
void setPointingAt(float x, float y, float z)