OpenGLVisualizer.cpp
Go to the documentation of this file.
1 // ****************************************************************************
2 // This file is part of the Integrating Vision Toolkit (IVT).
3 //
4 // The IVT is maintained by the Karlsruhe Institute of Technology (KIT)
5 // (www.kit.edu) in cooperation with the company Keyetech (www.keyetech.de).
6 //
7 // Copyright (C) 2014 Karlsruhe Institute of Technology (KIT).
8 // All rights reserved.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are met:
12 //
13 // 1. Redistributions of source code must retain the above copyright
14 // notice, this list of conditions and the following disclaimer.
15 //
16 // 2. Redistributions in binary form must reproduce the above copyright
17 // notice, this list of conditions and the following disclaimer in the
18 // documentation and/or other materials provided with the distribution.
19 //
20 // 3. Neither the name of the KIT nor the names of its contributors may be
21 // used to endorse or promote products derived from this software
22 // without specific prior written permission.
23 //
24 // THIS SOFTWARE IS PROVIDED BY THE KIT AND CONTRIBUTORS “AS IS” AND ANY
25 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 // DISCLAIMED. IN NO EVENT SHALL THE KIT OR CONTRIBUTORS BE LIABLE FOR ANY
28 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 // ****************************************************************************
35 // ****************************************************************************
36 // Filename: OpenGLVisualizer.cpp
37 // Author: Pedram Azad
38 // Date: 2004
39 // ****************************************************************************
40 // Changes: 25.10.2010, Zhixing Xue
41 // * Added COpenGLVisualizer::GetDepthMatrix
42 // ****************************************************************************
43 
44 
45 // ****************************************************************************
46 // Includes
47 // ****************************************************************************
48 
49 #include "OpenGLVisualizer.h"
51 #include "Image/ByteImage.h"
52 #include "Math/FloatMatrix.h"
53 #include "Math/Math3d.h"
54 #include "Math/Constants.h"
55 
56 #if defined __APPLE__
57 #include <OpenGL/gl.h>
58 #include <OpenGL/glu.h>
59 #include <OpenGL/glext.h>
60 #elif defined WIN32
61 #include <windows.h>
62 #include <GL/gl.h>
63 #include <GL/glu.h>
64 #include "glext.h"
65 #else
66 #include <GL/gl.h>
67 #include <GL/glu.h>
68 #include <GL/glx.h>
69 #include <GL/glext.h>
70 #endif
71 
72 #include <math.h>
73 #include <stdio.h>
74 
75 
76 // ****************************************************************************
77 // Static variables
78 // ****************************************************************************
79 
82 
83 #ifdef WIN32
84 static PFNGLGENBUFFERSARBPROC glGenBuffers = 0;
85 static PFNGLBINDBUFFERARBPROC glBindBuffer = 0;
86 static PFNGLBUFFERDATAARBPROC glBufferData = 0;
87 static PFNGLMAPBUFFERARBPROC glMapBuffer = 0;
88 static PFNGLUNMAPBUFFERARBPROC glUnmapBuffer = 0;
89 #endif
90 
91 const float COpenGLVisualizer::red[] = { 0.75f, 0, 0 };
92 const float COpenGLVisualizer::green[] = { 0, 0.75f, 0 };
93 const float COpenGLVisualizer::blue[] = { 0, 0, 0.75f };
94 const float COpenGLVisualizer::yellow[] = { 0.65f, 0.5f, 0.49f };
95 
96 
97 
98 // ****************************************************************************
99 // Constructor / Destructor
100 // ****************************************************************************
101 
103 {
104  bExtensionInitialized = false;
105  m_pQuadric = 0;
106 
107  width = 0;
108  height = 0;
109 
112  m_bMatrixOnStack = false;
113 }
114 
116 {
117  if (m_pQuadric)
118  gluDeleteQuadric(m_pQuadric);
119 }
120 
121 
122 // ****************************************************************************
123 // Methods
124 // ****************************************************************************
125 
127 {
128  Mat3d K;
129 
130  if (pCalibration)
131  {
132  width = pCalibration->GetCameraParameters().width;
133  height = pCalibration->GetCameraParameters().height;
134  pCalibration->GetCalibrationMatrix(K);
135  }
136  else
137  {
138  // apply default values
139  width = 640;
140  height = 480;
141  Math3d::SetMat(K, 580, 0, 320, 0, 580, 240, 0, 0, 1);
142  }
143 
144  // projection matrix
145  glMatrixMode(GL_PROJECTION);
146  glLoadIdentity();
147 
148  float m[16];
150  glMultMatrixf(m);
151 
152  // model view matrix
153  glMatrixMode(GL_MODELVIEW);
154  glLoadIdentity();
155  glRotatef(180, 1, 0, 0);
156 
157  // account for extrinsic calibration
158  if (pCalibration)
159  {
160  float m[16];
161  Transformation3d transformation;
162  Math3d::SetMat(transformation.rotation, pCalibration->GetCameraParameters().rotation);
163  Math3d::SetVec(transformation.translation, pCalibration->GetCameraParameters().translation);
164  ConvertToOpenGLMatrix(transformation, m);
165  glMultMatrixf(m);
166  }
167 }
168 
169 void COpenGLVisualizer::SetProjectionMatrix(int nWidth, int nHeight)
170 {
171  Mat3d K;
172 
173  // apply default values for focal length and principal point
174  width = nWidth;
175  height = nHeight;
176  const float w_factor = width / 640.0f;
177  const float h_factor = height / 480.0f;
178  Math3d::SetMat(K, 580 * w_factor, 0, 320 * w_factor, 0, 580 * h_factor, 240 * h_factor, 0, 0, 1);
179 
180  // projection matrix
181  glMatrixMode(GL_PROJECTION);
182  glLoadIdentity();
183 
184  float m[16];
186  glMultMatrixf(m);
187 
188  // model view matrix
189  glMatrixMode(GL_MODELVIEW);
190  glLoadIdentity();
191  glRotatef(180, 1, 0, 0);
192 }
193 
194 void COpenGLVisualizer::ActivateShading(bool bActivateShading)
195 {
196  if (bActivateShading)
197  {
198  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
199  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
200  glClearDepth(1.0f);
201  glDepthFunc(GL_LESS);
202  glEnable(GL_DEPTH_TEST);
203  glShadeModel(GL_SMOOTH);
204  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
205  glEnable(GL_LIGHTING);
206  glEnable(GL_LIGHT0);
207  glEnable(GL_NORMALIZE);
208  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
209  //glEnable(GL_CULL_FACE);
210  }
211  else
212  {
213  glDisable(GL_LIGHTING);
214  glDisable(GL_DEPTH_TEST);
215  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
216  }
217 }
218 
219 bool COpenGLVisualizer::Init(int nWidth, int nHeight, bool bActivateShading)
220 {
221  ActivateShading(bActivateShading);
222 
223  // set projection model
224  SetProjectionMatrix(nWidth, nHeight);
225  glViewport(0, 0, nWidth, nHeight);
226 
227  // create quadric object
228  m_pQuadric = gluNewQuadric();
229 
230  // initialize extension for using pixel buffers for fast glReadPixels variant
231  if (!InitExtension())
232  {
233  //printf("info: pixel buffer extension is not available (slow method for glReadPixels will be used)\n");
234  return true;
235  }
236 
237  #ifdef WIN32
238  glGenBuffers(1, &bufferID);
239  #endif
240 
241  return true;
242 }
243 
244 bool COpenGLVisualizer::InitByCalibration(const CCalibration *pCalibration, bool bActivateShading)
245 {
246  ActivateShading(bActivateShading);
247 
248  // set projection model
249  SetProjectionMatrix(pCalibration);
250  glViewport(0, 0, width, height);
251 
252  // create quadric object
253  m_pQuadric = gluNewQuadric();
254 
255  // initialize extension for using pixel buffers for fast glReadPixels variant
256  if (!InitExtension())
257  {
258  //printf("info: pixel buffer extension is not available (slow method for glReadPixels will be used)\n");
259  return true;
260  }
261 
262  #ifdef WIN32
263  glGenBuffers(1, &bufferID);
264  #endif
265 
266  return true;
267 }
268 
269 bool COpenGLVisualizer::GetImage(CByteImage *pDestinationImage)
270 {
271  if (pDestinationImage->width != width || pDestinationImage->height != height)
272  {
273  printf("error: destination image does not match current mode\n");
274  return false;
275  }
276 
278  {
279  #ifdef WIN32
280  // fast method
281  const int nBytes = width * height *pDestinationImage->bytesPerPixel;
282  glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, bufferID);
283  glBufferData(GL_PIXEL_PACK_BUFFER_ARB, nBytes, NULL, GL_STREAM_READ);
284 
285  if (pDestinationImage->type == CByteImage::eRGB24)
286  glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, 0);
287  else
288  glReadPixels(0, 0, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0);
289 
290  void *pData = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
291  memcpy(pDestinationImage->pixels, pData, nBytes);
292  glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
293  glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
294  #endif
295  }
296  else
297  {
298  // slow method
299  if (pDestinationImage->type == CByteImage::eRGB24)
300  glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pDestinationImage->pixels);
301  else
302  glReadPixels(0, 0, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, pDestinationImage->pixels);
303  }
304 
305  return true;
306 }
307 
309 {
310  if (pDestinationMatrix->columns != width || pDestinationMatrix->rows != height)
311  {
312  printf("error: destination matrix does not match current mode\n");
313  return false;
314  }
315 
316  glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, pDestinationMatrix->data);
317 
318  return true;
319 }
320 
322 {
323  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
324 
325  float m[16];
327 
328  glMatrixMode(GL_MODELVIEW);
329 
330  if (m_bMatrixOnStack)
331  glPopMatrix();
332 
333  glPushMatrix();
334  glMultMatrixf(m);
335 
336  m_bMatrixOnStack = true;
337 }
338 
339 void COpenGLVisualizer::DrawPoint(float x, float y, float z, const float *pColor)
340 {
341  if (pColor)
342  glColor3fv(pColor);
343 
344  glDisable(GL_LIGHTING);
345 
346  glBegin(GL_POINTS);
347  glVertex3f(x, y, z);
348  glEnd();
349 
350  glEnable(GL_LIGHTING);
351 }
352 
353 void COpenGLVisualizer::DrawPoints(Vec3dList &points, const float *pColor)
354 {
355  if (pColor)
356  glColor3fv(pColor);
357 
358  glDisable(GL_LIGHTING);
359 
360  glBegin(GL_POINTS);
361 
362  const int c = (int) points.size();
363  for (int i = 0; i < c; i++)
364  {
365  const Vec3d &v = points.at(i);
366  glVertex3f(v.x, v.y, v.z);
367 
368  if (c % 10000 == 0)
369  {
370  glEnd();
371  glBegin(GL_POINTS);
372  }
373  }
374 
375  glEnd();
376 
377  glEnable(GL_LIGHTING);
378 }
379 
380 void COpenGLVisualizer::DrawSphere(const Vec3d &point, float radius, const float *pColor)
381 {
382  glPushMatrix();
383 
384  glTranslated(point.x, point.y, point.z);
385  if (pColor) glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pColor);
386  gluSphere(m_pQuadric, radius, 50, 50);
387 
388  glPopMatrix();
389 }
390 
391 void COpenGLVisualizer::DrawCylinder(const Vec3d &point1, const Vec3d &point2, float radius1, float radius2, const float color[3])
392 {
393  Vec3d u, _point1;
394  Math3d::SubtractVecVec(point2, point1, u);
395 
396  Math3d::SetVec(_point1, u);
397  Math3d::MulVecScalar(_point1, 0.15f, _point1);
398  Math3d::AddToVec(_point1, point1);
399 
400  const float length = Math3d::Length(u);
402 
403  glPushMatrix();
404 
405  //glTranslated(_point1.x, _point1.y, _point1.z);
406  glTranslated(point1.x, point1.y, point1.z);
407  glRotatef(acosf(u.z) * 180.0f / FLOAT_PI, -u.y, u.x, 0.0f);
408  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
409  gluCylinder(m_pQuadric, radius1, radius2, length, 20, 20);
410 
411  glPopMatrix();
412 }
413 
414 void COpenGLVisualizer::ConvertToOpenGLMatrix(const Transformation3d &transformation, float resultMatrix[16])
415 {
416  resultMatrix[0] = transformation.rotation.r1;
417  resultMatrix[1] = transformation.rotation.r4;
418  resultMatrix[2] = transformation.rotation.r7;
419  resultMatrix[3] = 0;
420  resultMatrix[4] = transformation.rotation.r2;
421  resultMatrix[5] = transformation.rotation.r5;
422  resultMatrix[6] = transformation.rotation.r8;
423  resultMatrix[7] = 0;
424  resultMatrix[8] = transformation.rotation.r3;
425  resultMatrix[9] = transformation.rotation.r6;
426  resultMatrix[10] = transformation.rotation.r9;
427  resultMatrix[11] = 0;
428  resultMatrix[12] = transformation.translation.x;
429  resultMatrix[13] = transformation.translation.y;
430  resultMatrix[14] = transformation.translation.z;
431  resultMatrix[15] = 1;
432 }
433 
434 void COpenGLVisualizer::DrawObject(const CFloatMatrix *pMatrix, const Transformation3d &transformation)
435 {
436  const int nTriangles = pMatrix->rows / 3;
437  const float *data = pMatrix->data;
438  float m[16];
439 
440  ConvertToOpenGLMatrix(transformation, m);
441 
442  glPushMatrix();
443  glMultMatrixf(m);
444 
445  for (int i = 0, offset = 0; i < nTriangles; i++, offset += 18)
446  {
447  glBegin(GL_TRIANGLES);
448  glNormal3f(data[offset], data[offset + 1], data[offset + 2]);
449  glVertex3f(data[offset + 3], data[offset + 4], data[offset + 5]);
450  glNormal3f(data[offset + 6], data[offset + 7], data[offset + 8]);
451  glVertex3f(data[offset + 9], data[offset + 10], data[offset + 11]);
452  glNormal3f(data[offset + 12], data[offset + 13], data[offset + 14]);
453  glVertex3f(data[offset + 15], data[offset + 16], data[offset + 17]);
454  glEnd();
455  }
456 
457  glPopMatrix();
458 }
459 
460 
461 void COpenGLVisualizer::CalculateOpenGLProjectionMatrix(const Mat3d &K, int width, int height, float gnear, float gfar, float *m)
462 {
463  // note: for OpenGL, matrix must have column-major order!
464  m[0] = (2.0f * K.r1 / width);
465  m[1] = 0.0f;
466  m[2] = 0.0f;
467  m[3] = 0.0f;
468  m[4] = (2.0f * K.r2 / width);
469  m[5] = (2.0f * K.r5 / height);
470  m[6] = 0.0f;
471  m[7] = 0.0f;
472  m[8] = -((2.0f * K.r3 / width) - 1.0f);
473  m[9] = ((2.0f * K.r6 / height) - 1.0f);
474  m[10] = -(gfar + gnear) / (gfar - gnear);
475  m[11] = -1.0f;
476  m[12] = 0.0f;
477  m[13] = 0.0f;
478  m[14] = -2.0f * gfar * gnear / (gfar - gnear);
479  m[15] = 0.0f;
480 }
481 
482 void COpenGLVisualizer::CalculateOpenGLProjectionMatrixDefaultPrincipalPoint(const Mat3d &K, int width, int height, float gnear, float gfar, float *m)
483 {
484  // note: for OpenGL, matrix must have column-major order!
485  m[0] = (2.0f * K.r1 / width);
486  m[1] = 0.0f;
487  m[2] = 0.0f;
488  m[3] = 0.0f;
489  m[4] = (2.0f * K.r2 / width);
490  m[5] = (2.0f * K.r5 / height);
491  m[6] = 0.0f;
492  m[7] = 0.0f;
493  m[8] = 0.0f;
494  m[9] = 0.0f;
495  m[10] = -(gfar + gnear) / (gfar - gnear);
496  m[11] = -1.0f;
497  m[12] = 0.0f;
498  m[13] = 0.0f;
499  m[14] = -2.0f * gfar * gnear / (gfar - gnear);
500  m[15] = 0.0f;
501 }
502 
504 {
506  return true;
507 
508  #ifdef WIN32
509  glGenBuffers = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
510  glBindBuffer = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");
511  glBufferData = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");
512  glMapBuffer = (PFNGLMAPBUFFERARBPROC) wglGetProcAddress("glMapBufferARB");
513  glUnmapBuffer = (PFNGLUNMAPBUFFERARBPROC) wglGetProcAddress("glUnmapBufferARB");
514  bExtensionInitialized = glGenBuffers && glBindBuffer && glBufferData && glMapBuffer && glUnmapBuffer;
515  #else
516  /*glGenBuffers = (PFNGLGENBUFFERSARBPROC) glXGetProcAddress((const GLubyte *) "glGenBuffersARB");
517  glBindBuffer = (PFNGLBINDBUFFERARBPROC) glXGetProcAddress((const GLubyte *) "glBindBufferARB");
518  glBufferData = (PFNGLBUFFERDATAARBPROC) glXGetProcAddress((const GLubyte *) "glBufferDataARB");
519  glMapBuffer = (PFNGLMAPBUFFERARBPROC) glXGetProcAddress((const GLubyte *) "glMapBufferARB");
520  glUnmapBuffer = (PFNGLUNMAPBUFFERARBPROC) glXGetProcAddress((const GLubyte *) "glUnmapBufferARB");*/
521  bExtensionInitialized = false;
522  #endif
523 
524  return bExtensionInitialized;
525 }
float r4
Definition: Math3d.h:95
bool GetImage(CByteImage *pDestinationImage)
void ActivateShading(bool bActivateShading)
GLvoid *APIENTRYP PFNGLMAPBUFFERARBPROC(GLenum target, GLenum access)
Definition: glext.h:3992
bool GetDepthMatrix(CFloatMatrix *pDestinationMatrix)
static void ConvertToOpenGLMatrix(const Transformation3d &transformation, float resultMatrix[16])
float r7
Definition: Math3d.h:95
GLdouble GLdouble z
Definition: glext.h:3343
static const float green[3]
static GLuint bufferID
float r1
Definition: Math3d.h:95
int width
The width of the image in pixels.
Definition: ByteImage.h:257
Vec3d translation
Definition: Math3d.h:108
float r2
Definition: Math3d.h:95
bool InitByCalibration(const CCalibration *pCalibration, bool bActivateShading=true)
float r3
Definition: Math3d.h:95
Data structure for the representation of a 3D vector.
Definition: Math3d.h:73
float x
Definition: Math3d.h:75
Data structure for the representation of 8-bit grayscale images and 24-bit RGB (or HSV) color images ...
Definition: ByteImage.h:80
float Length(const Vec3d &vec)
Definition: Math3d.cpp:585
GLintptr offset
Definition: glext.h:3389
float z
Definition: Math3d.h:75
#define GL_READ_ONLY
Definition: glext.h:343
Mat3d rotation
Definition: Math3d.h:107
void DrawObject(const CFloatMatrix *pMatrix, const Transformation3d &transformation)
unsigned char * pixels
The pointer to the the pixels.
Definition: ByteImage.h:283
GLsizei const GLfloat * points
Definition: glext.h:4388
std::vector< Vec3d > Vec3dList
Definition: Math3d.h:126
void GetCalibrationMatrix(Mat3d &K) const
Sets up the calibration matrix K.
Definition: Calibration.cpp:91
static const float yellow[3]
GLenum GLint x
Definition: glext.h:3125
const CCameraParameters & GetCameraParameters() const
Gives access to the camera parameters.
Definition: Calibration.h:268
const GLubyte * c
Definition: glext.h:5181
const Vec3d zero_vec
Definition: Math3d.cpp:59
void SetVec(Vec3d &vec, float x, float y, float z)
Definition: Math3d.cpp:243
float y
Definition: Math3d.h:75
float r6
Definition: Math3d.h:95
void MulVecScalar(const Vec3d &vec, float scalar, Vec3d &result)
Definition: Math3d.cpp:502
Data structure for the representation of a matrix of values of the data type float.
Definition: FloatMatrix.h:56
void DrawPoint(float x, float y, float z, const float *pColor=0)
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: glext.h:3129
void AddToVec(Vec3d &vec, const Vec3d &vectorToAdd)
Definition: Math3d.cpp:481
float r8
Definition: Math3d.h:95
float r9
Definition: Math3d.h:95
float * data
Definition: FloatMatrix.h:91
int height
The height of the image in pixels.
Definition: ByteImage.h:264
void DrawPoints(Vec3dList &points, const float *pColor=0)
static const float blue[3]
int bytesPerPixel
The number of bytes used for encoding one pixel.
Definition: ByteImage.h:273
static const float red[3]
static void CalculateOpenGLProjectionMatrix(const Mat3d &K, int width, int height, float gnear, float gfar, float *m)
GLenum GLsizei width
Definition: glext.h:3122
GLenum GLsizei GLsizei height
Definition: glext.h:3132
bool Init(int width=640, int height=480, bool bActivateShading=true)
void SetProjectionMatrix(const CCalibration *pCalibration)
#define FLOAT_PI
Definition: Constants.h:50
#define GL_PIXEL_PACK_BUFFER_ARB
Definition: glext.h:951
ImageType type
The type of the image.
Definition: ByteImage.h:292
void NormalizeVec(Vec3d &vec)
Definition: Math3d.cpp:573
float r5
Definition: Math3d.h:95
Transformation3d m_ViewMatrix
const Mat3d unit_mat
Definition: Math3d.cpp:60
GLuint GLsizei GLsizei * length
Definition: glext.h:3509
GLenum GLint GLint y
Definition: glext.h:3125
const GLdouble * v
Definition: glext.h:3212
void SubtractVecVec(const Vec3d &vector1, const Vec3d &vector2, Vec3d &result)
Definition: Math3d.cpp:522
static bool bExtensionInitialized
static void CalculateOpenGLProjectionMatrixDefaultPrincipalPoint(const Mat3d &K, int width, int height, float gnear, float gfar, float *m)
#define GL_STREAM_READ
Definition: glext.h:350
void SetMat(Mat3d &matrix, float r1, float r2, float r3, float r4, float r5, float r6, float r7, float r8, float r9)
Definition: Math3d.cpp:257
Data structure for the representation of a 3x3 matrix.
Definition: Math3d.h:93
Camera model parameters and functions for a single camera.
Definition: Calibration.h:125
void DrawCylinder(const Vec3d &point1, const Vec3d &point2, float radius1, float radius2, const float color[3])
typedef GLuint(APIENTRYP PFNGLCREATEPROGRAMPROC)(void)
Data structure for the representation of a 3D rigid body transformation.
Definition: Math3d.h:105
GLUquadric * m_pQuadric
void DrawSphere(const Vec3d &point, float radius, const float *pColor=0)


asr_ivt
Author(s): Allgeyer Tobias, Hutmacher Robin, Kleinert Daniel, Meißner Pascal, Scholz Jonas, Stöckle Patrick
autogenerated on Mon Dec 2 2019 03:47:28