Main MRPT website > C++ reference for MRPT 1.9.9
CFrustum.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2017, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "opengl-precomp.h" // Precompiled header
11 #include <mrpt/opengl/CFrustum.h>
12 #include <mrpt/utils/CStream.h>
13 #include <mrpt/opengl/gl_utils.h>
14 
15 #include "opengl_internals.h"
16 
17 using namespace mrpt;
18 using namespace mrpt::opengl;
19 using namespace mrpt::utils;
20 using namespace mrpt::math;
21 using namespace std;
22 
24 
25 /*---------------------------------------------------------------
26  render
27  ---------------------------------------------------------------*/
28 void CFrustum::render_dl() const
29 {
30 #if MRPT_HAS_OPENGL_GLUT
31  if (m_color.A != 255 || (m_draw_planes && m_planes_color.A != 255))
32  {
35  }
36  else
37  {
40  }
41 
42  // Compute the 8 corners of the frustum:
43  TPoint3Df pts[8];
44  for (int j = 0; j < 2; j++)
45  {
46  const float r = j == 0 ? m_min_distance : m_max_distance;
47  for (int i = 0; i < 4; i++) pts[4 * j + i].x = r;
48  pts[4 * j + 0].y = -r * tan(m_fov_horz_left);
49  pts[4 * j + 1].y = -r * tan(m_fov_horz_left);
50  pts[4 * j + 2].y = r * tan(m_fov_horz_right);
51  pts[4 * j + 3].y = r * tan(m_fov_horz_right);
52  pts[4 * j + 0].z = -r * tan(m_fov_vert_down);
53  pts[4 * j + 1].z = r * tan(m_fov_vert_up);
54  pts[4 * j + 2].z = -r * tan(m_fov_vert_down);
55  pts[4 * j + 3].z = r * tan(m_fov_vert_up);
56  }
57 
58  // Render lines:
59  if (m_draw_lines)
60  {
61  glDisable(GL_LIGHTING); // Disable lights when drawing lines
62 
63  const int draw_path[] = {0, 1, 3, 2, 0, 4, 6, 2,
64  3, 7, 6, 4, 5, 7, 5, 1};
65 
66  // wireframe:
67  glLineWidth(m_lineWidth);
70  glColor4ub(m_color.R, m_color.G, m_color.B, m_color.A);
71 
72  for (size_t i = 0; i < sizeof(draw_path) / sizeof(draw_path[0]); i++)
73  glVertex3fv(&pts[draw_path[i]].x);
74 
75  glEnd();
76 
77  glEnable(GL_LIGHTING); // Disable lights when drawing lines
78  }
79 
80  if (m_draw_planes)
81  {
82  // solid:
84  glColor4ub(
85  m_planes_color.R, m_planes_color.G, m_planes_color.B,
86  m_planes_color.A);
87 
88  gl_utils::renderQuadWithNormal(pts[0], pts[2], pts[6], pts[4]);
89  gl_utils::renderQuadWithNormal(pts[2], pts[3], pts[7], pts[6]);
90  gl_utils::renderQuadWithNormal(pts[4], pts[6], pts[7], pts[5]);
91  gl_utils::renderQuadWithNormal(pts[1], pts[5], pts[7], pts[3]);
92  gl_utils::renderQuadWithNormal(pts[1], pts[5], pts[7], pts[3]);
93  gl_utils::renderQuadWithNormal(pts[4], pts[5], pts[1], pts[0]);
94 
95  glEnd();
96  }
97 
99 
100 #endif
101 }
102 
103 // Ctors
105  : m_min_distance(0.1f),
106  m_max_distance(1.f),
107  m_fov_horz_left(mrpt::utils::DEG2RAD(45)),
108  m_fov_horz_right(mrpt::utils::DEG2RAD(45)),
109  m_fov_vert_down(mrpt::utils::DEG2RAD(30)),
110  m_fov_vert_up(mrpt::utils::DEG2RAD(30)),
111  m_draw_lines(true),
112  m_draw_planes(false),
113  m_lineWidth(1.5f),
114  m_planes_color(0xE0, 0x00, 0x00, 0x50) // RGBA
115 {
122  keep_min(m_fov_vert_up, DEG2RAD(89.9f));
124 }
125 
127  float near_distance, float far_distance, float horz_FOV_degrees,
128  float vert_FOV_degrees, float lineWidth, bool draw_lines, bool draw_planes)
129  : m_min_distance(near_distance),
130  m_max_distance(far_distance),
131  m_fov_horz_left(mrpt::utils::DEG2RAD(.5f * horz_FOV_degrees)),
132  m_fov_horz_right(mrpt::utils::DEG2RAD(.5f * horz_FOV_degrees)),
133  m_fov_vert_down(mrpt::utils::DEG2RAD(.5f * vert_FOV_degrees)),
134  m_fov_vert_up(mrpt::utils::DEG2RAD(.5f * vert_FOV_degrees)),
135  m_draw_lines(draw_lines),
136  m_draw_planes(draw_planes),
137  m_lineWidth(lineWidth),
138  m_planes_color(0xE0, 0x00, 0x00, 0x50) // RGBA
139 {
140 }
141 
142 /*---------------------------------------------------------------
143  Implements the writing to a CStream capability of
144  CSerializable objects
145  ---------------------------------------------------------------*/
146 void CFrustum::writeToStream(mrpt::utils::CStream& out, int* version) const
147 {
148  if (version)
149  *version = 0;
150  else
151  {
152  writeToStreamRender(out);
153  // version 0
158  }
159 }
160 
161 /*---------------------------------------------------------------
162  Implements the reading from a CStream capability of
163  CSerializable objects
164  ---------------------------------------------------------------*/
166 {
167  switch (version)
168  {
169  case 0:
176  break;
177  default:
179  };
181 }
182 
183 bool CFrustum::traceRay(const mrpt::poses::CPose3D& o, double& dist) const
184 {
186  MRPT_UNUSED_PARAM(dist);
187  THROW_EXCEPTION("TO DO")
188 }
189 
190 // setters:
192  const float near_distance, const float far_distance)
193 {
194  m_min_distance = near_distance;
195  m_max_distance = far_distance;
197 }
198 void CFrustum::setHorzFOV(const float fov_horz_degrees)
199 {
201  0.5f * mrpt::utils::DEG2RAD(fov_horz_degrees);
207 }
208 void CFrustum::setVertFOV(const float fov_vert_degrees)
209 {
211  0.5f * mrpt::utils::DEG2RAD(fov_vert_degrees);
214  keep_min(m_fov_vert_up, DEG2RAD(89.9f));
217 }
219  const float fov_horz_left_degrees, const float fov_horz_right_degrees)
220 {
221  m_fov_horz_left = mrpt::utils::DEG2RAD(fov_horz_left_degrees);
222  m_fov_horz_right = mrpt::utils::DEG2RAD(fov_horz_right_degrees);
228 }
230  const float fov_vert_down_degrees, const float fov_vert_up_degrees)
231 {
232  m_fov_vert_down = mrpt::utils::DEG2RAD(fov_vert_down_degrees);
233  m_fov_vert_up = mrpt::utils::DEG2RAD(fov_vert_up_degrees);
236  keep_min(m_fov_vert_up, DEG2RAD(89.9f));
239 }
240 
242  mrpt::math::TPoint3D& bb_min, mrpt::math::TPoint3D& bb_max) const
243 {
244  // Compute the 8 corners of the frustum:
245  TPoint3Df pts[8];
246  for (int j = 0; j < 2; j++)
247  {
248  const float r = j == 0 ? m_min_distance : m_max_distance;
249  for (int i = 0; i < 4; i++) pts[4 * j + i].x = r;
250  pts[4 * j + 0].y = -r * tan(m_fov_horz_left);
251  pts[4 * j + 1].y = -r * tan(m_fov_horz_left);
252  pts[4 * j + 2].y = r * tan(m_fov_horz_right);
253  pts[4 * j + 3].y = r * tan(m_fov_horz_right);
254  pts[4 * j + 0].z = -r * tan(m_fov_vert_down);
255  pts[4 * j + 1].z = r * tan(m_fov_vert_up);
256  pts[4 * j + 2].z = -r * tan(m_fov_vert_down);
257  pts[4 * j + 3].z = r * tan(m_fov_vert_up);
258  }
259 
260  bb_min = TPoint3D(
261  std::numeric_limits<double>::max(), std::numeric_limits<double>::max(),
262  std::numeric_limits<double>::max());
263  bb_max = TPoint3D(
264  -std::numeric_limits<double>::max(),
265  -std::numeric_limits<double>::max(),
266  -std::numeric_limits<double>::max());
267  for (int i = 0; i < 8; i++)
268  {
269  keep_min(bb_min.x, pts[i].x);
270  keep_min(bb_min.y, pts[i].y);
271  keep_min(bb_min.z, pts[i].z);
272 
273  keep_max(bb_max.x, pts[i].x);
274  keep_max(bb_max.y, pts[i].y);
275  keep_max(bb_max.z, pts[i].z);
276  }
277 
278  // Convert to coordinates of my parent:
279  m_pose.composePoint(bb_min, bb_min);
280  m_pose.composePoint(bb_max, bb_max);
281 }
void writeToStreamRender(utils::CStream &out) const
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
bool traceRay(const mrpt::poses::CPose3D &o, double &dist) const override
Ray tracing.
Definition: CFrustum.cpp:183
GLAPI void GLAPIENTRY glVertex3fv(const GLfloat *v)
double DEG2RAD(const double x)
Degrees to radians.
GLAPI void GLAPIENTRY glEnable(GLenum cap)
void renderQuadWithNormal(const mrpt::math::TPoint3Df &p1, const mrpt::math::TPoint3Df &p2, const mrpt::math::TPoint3Df &p3, const mrpt::math::TPoint3Df &p4)
Can be used by derived classes to draw a quad with a normal vector computed automatically - to be cal...
Definition: gl_utils.cpp:202
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
#define THROW_EXCEPTION(msg)
#define GL_TRIANGLES
Definition: glew.h:276
float m_min_distance
Near and far planes.
Definition: CFrustum.h:60
void setVertFOV(const float fov_vert_degrees)
Changes vertical FOV (symmetric)
Definition: CFrustum.cpp:208
EIGEN_STRONG_INLINE void notifyChange() const
Must be called to notify that the object has changed (so, the display list must be updated) ...
void readFromStream(mrpt::utils::CStream &in, int version) override
Introduces a pure virtual method responsible for loading from a CStream This can not be used directly...
Definition: CFrustum.cpp:165
STL namespace.
#define GL_ONE_MINUS_SRC_ALPHA
Definition: glew.h:287
#define GL_DEPTH_TEST
Definition: glew.h:401
void setHorzFOV(const float fov_horz_degrees)
Changes horizontal FOV (symmetric)
Definition: CFrustum.cpp:198
#define GL_LIGHTING
Definition: glew.h:385
GLAPI void GLAPIENTRY glLineWidth(GLfloat width)
mrpt::poses::CPose3D m_pose
6D pose wrt the parent coordinate reference.
Definition: CRenderizable.h:57
GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
A renderizable object suitable for rendering with OpenGL&#39;s display lists.
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
Definition: CStream.h:41
This base provides a set of functions for maths stuff.
Definition: CArrayNumeric.h:19
Lightweight 3D point (float version).
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
CFrustum()
Basic empty constructor.
Definition: CFrustum.cpp:104
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
void readFromStreamRender(mrpt::utils::CStream &in)
double x
X,Y,Z coordinates.
GLAPI void GLAPIENTRY glBegin(GLenum mode)
#define GL_BLEND
Definition: glew.h:432
#define DEG2RAD
void keep_max(T &var, const K test_val)
If the second argument is above the first one, set the first argument to this higher value...
Definition: bits.h:227
GLAPI void GLAPIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
#define GL_SRC_ALPHA
Definition: glew.h:286
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
GLdouble GLdouble GLdouble r
Definition: glext.h:3705
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value...
Definition: bits.h:220
float m_fov_horz_left
Semi FOVs (in radians)
Definition: CFrustum.h:62
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
Definition: CPose3D.h:88
void setNearFarPlanes(const float near_distance, const float far_distance)
Changes distance of near & far planes.
Definition: CFrustum.cpp:191
void composePoint(double lx, double ly, double lz, double &gx, double &gy, double &gz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=nullptr, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dpose=nullptr, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dse3=nullptr, bool use_small_rot_approx=false) const
An alternative, slightly more efficient way of doing with G and L being 3D points and P this 6D pose...
Definition: CPose3D.cpp:453
void checkOpenGLError()
Checks glGetError and throws an exception if an error situation is found.
Definition: gl_utils.cpp:140
GLuint in
Definition: glext.h:7274
The namespace for 3D scene representation and rendering.
Definition: CGlCanvasBase.h:15
void setVertFOVAsymmetric(const float fov_vert_down_degrees, const float fov_vert_up_degrees)
Changes vertical FOV (asymmetric)
Definition: CFrustum.cpp:229
GLAPI void GLAPIENTRY glEnd(void)
A solid or wireframe frustum in 3D (a rectangular truncated pyramid), with arbitrary (possibly assyme...
Definition: CFrustum.h:54
void getBoundingBox(mrpt::math::TPoint3D &bb_min, mrpt::math::TPoint3D &bb_max) const override
Evaluates the bounding box of this object (including possible children) in the coordinate frame of th...
Definition: CFrustum.cpp:241
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
#define GL_LINE_STRIP
Definition: glew.h:275
void writeToStream(mrpt::utils::CStream &out, int *getVersion) const override
Introduces a pure virtual method responsible for writing to a CStream.
Definition: CFrustum.cpp:146
GLenum GLint x
Definition: glext.h:3538
Lightweight 3D point.
void setHorzFOVAsymmetric(const float fov_horz_left_degrees, const float fov_horz_right_degrees)
Changes horizontal FOV (asymmetric)
Definition: CFrustum.cpp:218
GLAPI void GLAPIENTRY glDisable(GLenum cap)
mrpt::utils::TColor m_planes_color
Definition: CFrustum.h:67
float m_fov_vert_down
Semi FOVs (in radians)
Definition: CFrustum.h:64



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: ae4571287 Thu Nov 23 00:06:53 2017 +0100 at dom oct 27 23:51:55 CET 2019