20 float CGlCanvasBase::SENSIBILITY_DEG_PER_PIXEL = 0.1f;
22 #if MRPT_HAS_OPENGL_GLUT 23 #ifdef MRPT_OS_WINDOWS 29 #include <OpenGL/gl.h> 30 #include <OpenGL/glu.h> 31 #include <GLUT/glut.h> 36 #ifdef HAVE_FREEGLUT_EXT_H 37 #include <GL/freeglut_ext.h> 41 void CGlCanvasBase::setMinimumZoom(
float zoom) { m_minZoom = zoom; }
42 void CGlCanvasBase::setMaximumZoom(
float zoom) { m_maxZoom = zoom; }
43 void CGlCanvasBase::setMousePos(
int x,
int y)
49 void CGlCanvasBase::setMouseClicked(
bool is) { mouseClicked = is; }
50 void CGlCanvasBase::updateZoom(CamaraParams&
params,
int x,
int y)
const 52 float zoom =
params.cameraZoomDistance * exp(0.01 * (
y - m_mouseClickY));
53 if (zoom <= m_minZoom || (m_maxZoom != -1.0f && m_maxZoom <= zoom))
return;
54 params.cameraZoomDistance = zoom;
55 if (
params.cameraZoomDistance < 0.01)
params.cameraZoomDistance = 0.01f;
57 float Az = -0.05 * (
x - m_mouseClickX);
58 float D = 0.001 *
params.cameraZoomDistance;
59 params.cameraPointingZ += D * Az;
62 void CGlCanvasBase::updateZoom(CamaraParams&
params,
float delta)
const 64 float zoom =
params.cameraZoomDistance * (1 - 0.03f * (delta / 120.0f));
65 if (zoom <= m_minZoom || (m_maxZoom != -1.0f && m_maxZoom <= zoom))
return;
67 params.cameraZoomDistance = zoom;
70 void CGlCanvasBase::updateRotate(CamaraParams&
params,
int x,
int y)
const 72 const float dis = max(0.01f, (
params.cameraZoomDistance));
73 float eye_x =
params.cameraPointingX +
76 float eye_y =
params.cameraPointingY +
83 float A_AzimuthDeg = -SENSIBILITY_DEG_PER_PIXEL * (
x - m_mouseClickX);
84 params.cameraAzimuthDeg += A_AzimuthDeg;
86 float A_ElevationDeg = SENSIBILITY_DEG_PER_PIXEL * (
y - m_mouseClickY);
87 params.setElevationDeg(
params.cameraElevationDeg + A_ElevationDeg);
90 params.cameraPointingX = eye_x -
93 params.cameraPointingY = eye_y -
100 void CGlCanvasBase::updateOrbitCamera(CamaraParams&
params,
int x,
int y)
const 102 params.cameraAzimuthDeg -= 0.2 * (
x - m_mouseClickX);
104 params.cameraElevationDeg + 0.2 * (
y - m_mouseClickY));
107 void CGlCanvasBase::updateLastPos(
int x,
int y)
113 void CGlCanvasBase::resizeViewport(
int w,
int h)
115 if (
w == -1 || h == -1)
return;
120 void CGlCanvasBase::clearColors()
122 glClearColor(clearColorR, clearColorG, clearColorB, clearColorA);
125 void CGlCanvasBase::updatePan(CamaraParams&
params,
int x,
int y)
const 127 float Ay = -(
x - m_mouseClickX);
128 float Ax = -(
y - m_mouseClickY);
129 float D = 0.001 *
params.cameraZoomDistance;
138 return m_cameraParams;
143 return m_cameraParams;
151 float CGlCanvasBase::getZoomDistance()
const 153 return m_cameraParams.cameraZoomDistance;
156 void CGlCanvasBase::setZoomDistance(
float zoom)
158 m_cameraParams.cameraZoomDistance = zoom;
164 m_cameraParams.cameraPointingX, m_cameraParams.cameraPointingY,
165 m_cameraParams.cameraPointingZ);
175 void CGlCanvasBase::setUseCameraFromScene(
bool is) { useCameraFromScene = is; }
176 bool CGlCanvasBase::getUseCameraFromScene()
const {
return useCameraFromScene; }
177 void CGlCanvasBase::setAzimuthDegrees(
float ang)
179 m_cameraParams.cameraAzimuthDeg = ang;
182 void CGlCanvasBase::setElevationDegrees(
float ang)
184 m_cameraParams.cameraElevationDeg = ang;
187 float CGlCanvasBase::getAzimuthDegrees()
const 189 return m_cameraParams.cameraAzimuthDeg;
192 float CGlCanvasBase::getElevationDegrees()
const 194 return m_cameraParams.cameraElevationDeg;
197 void CGlCanvasBase::setCameraProjective(
bool is)
199 m_cameraParams.cameraIsProjective = is;
202 bool CGlCanvasBase::isCameraProjective()
const 204 return m_cameraParams.cameraIsProjective;
207 void CGlCanvasBase::setCameraFOV(
float FOV) { m_cameraParams.cameraFOV = FOV; }
208 float CGlCanvasBase::cameraFOV()
const {
return m_cameraParams.cameraFOV; }
209 void CGlCanvasBase::setClearColors(
float r,
float g,
float b,
float a)
217 float CGlCanvasBase::getClearColorR()
const {
return clearColorR; }
218 float CGlCanvasBase::getClearColorG()
const {
return clearColorG; }
219 float CGlCanvasBase::getClearColorB()
const {
return clearColorB; }
220 float CGlCanvasBase::getClearColorA()
const {
return clearColorA; }
223 m_openGLScene = scene;
226 void CGlCanvasBase::setCameraPointing(
float pointX,
float pointY,
float pointZ)
228 m_cameraParams.cameraPointingX = pointX;
229 m_cameraParams.cameraPointingY = pointY;
230 m_cameraParams.cameraPointingZ = pointZ;
233 float CGlCanvasBase::getCameraPointingX()
const 235 return m_cameraParams.cameraPointingX;
238 float CGlCanvasBase::getCameraPointingY()
const 240 return m_cameraParams.cameraPointingY;
243 float CGlCanvasBase::getCameraPointingZ()
const 245 return m_cameraParams.cameraPointingZ;
248 double CGlCanvasBase::renderCanvas(
int width,
int height)
275 if (!useCameraFromScene)
281 "Fatal error: there is no 'main' viewport in the 3D " 286 updateCameraParams(cam);
298 m_openGLScene->render();
312 catch (std::exception& e)
316 std::string(
"[CWxGLCanvasBase::Render] Exception!: ") +
318 std::cerr << err_msg;
319 renderError(err_msg);
324 std::cerr <<
"Runtime error!" << std::endl;
330 void CGlCanvasBase::CamaraParams::setElevationDeg(
float deg)
332 cameraElevationDeg = deg;
334 if (cameraElevationDeg < -90.0f)
335 cameraElevationDeg = -90.0f;
336 else if (cameraElevationDeg > 90.0f)
337 cameraElevationDeg = 90.0f;
GLAPI void GLAPIENTRY glFlush(void)
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
std::shared_ptr< COpenGLViewport > Ptr
GLAPI void GLAPIENTRY glMatrixMode(GLenum mode)
GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
GLAPI void GLAPIENTRY glEnable(GLenum cap)
#define THROW_EXCEPTION(msg)
void setProjectiveModel(bool v=true)
Enable/Disable projective mode (vs.
GLAPI void GLAPIENTRY glPopAttrib(void)
void Tic()
Starts the stopwatch.
GLAPI void GLAPIENTRY glLoadIdentity(void)
GLubyte GLubyte GLubyte GLubyte w
void setZoomDistance(float z)
void setAzimuthDegrees(float ang)
This class implements a high-performance stopwatch.
void setProjectiveFOVdeg(float ang)
Field-of-View in degs, only when projectiveModel=true (default=30 deg).
double DEG2RAD(const double x)
Degrees to radians.
GLsizei const GLchar ** string
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
void setElevationDegrees(float ang)
GLdouble GLdouble GLdouble r
GLAPI void GLAPIENTRY glPushAttrib(GLbitfield mask)
std::shared_ptr< COpenGLScene > Ptr
The namespace for 3D scene representation and rendering.
double Tac()
Stops the stopwatch.
#define GL_ALL_ATTRIB_BITS
Classes for creating GUI windows for 2D and 3D visualization.
A camera: if added to a scene, the viewpoint defined by this camera will be used instead of the camer...
GLenum GLsizei GLsizei height
GLubyte GLubyte GLubyte a
GLenum const GLfloat * params
void setPointingAt(float x, float y, float z)