quaternion_demo.cpp
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #include "quaternion_demo.h"
11 #include "icosphere.h"
12 
13 #include <Eigen/Geometry>
14 #include <Eigen/QR>
15 #include <Eigen/LU>
16 
17 #include <iostream>
18 #include <QEvent>
19 #include <QMouseEvent>
20 #include <QInputDialog>
21 #include <QGridLayout>
22 #include <QButtonGroup>
23 #include <QRadioButton>
24 #include <QDockWidget>
25 #include <QPushButton>
26 #include <QGroupBox>
27 
28 using namespace Eigen;
29 
31 {
32  public:
34 
36  {
37  const int levels = 4;
38  const float scale = 0.33;
39  float radius = 100;
40  std::vector<int> parents;
41 
42  // leval 0
43  mCenters.push_back(Vector3f::Zero());
44  parents.push_back(-1);
45  mRadii.push_back(radius);
46 
47  // generate level 1 using icosphere vertices
48  radius *= 0.45;
49  {
50  float dist = mRadii[0]*0.9;
51  for (int i=0; i<12; ++i)
52  {
53  mCenters.push_back(mIcoSphere.vertices()[i] * dist);
54  mRadii.push_back(radius);
55  parents.push_back(0);
56  }
57  }
58 
59  static const float angles [10] = {
60  0, 0,
61  M_PI, 0.*M_PI,
62  M_PI, 0.5*M_PI,
63  M_PI, 1.*M_PI,
64  M_PI, 1.5*M_PI
65  };
66 
67  // generate other levels
68  int start = 1;
69  for (int l=1; l<levels; l++)
70  {
71  radius *= scale;
72  int end = mCenters.size();
73  for (int i=start; i<end; ++i)
74  {
75  Vector3f c = mCenters[i];
76  Vector3f ax0 = (c - mCenters[parents[i]]).normalized();
77  Vector3f ax1 = ax0.unitOrthogonal();
78  Quaternionf q;
79  q.setFromTwoVectors(Vector3f::UnitZ(), ax0);
80  Affine3f t = Translation3f(c) * q * Scaling(mRadii[i]+radius);
81  for (int j=0; j<5; ++j)
82  {
83  Vector3f newC = c + ( (AngleAxisf(angles[j*2+1], ax0)
84  * AngleAxisf(angles[j*2+0] * (l==1 ? 0.35 : 0.5), ax1)) * ax0)
85  * (mRadii[i] + radius*0.8);
86  mCenters.push_back(newC);
87  mRadii.push_back(radius);
88  parents.push_back(i);
89  }
90  }
91  start = end;
92  }
93  }
94 
95  void draw()
96  {
97  int end = mCenters.size();
98  glEnable(GL_NORMALIZE);
99  for (int i=0; i<end; ++i)
100  {
101  Affine3f t = Translation3f(mCenters[i]) * Scaling(mRadii[i]);
102  gpu.pushMatrix(GL_MODELVIEW);
103  gpu.multMatrix(t.matrix(),GL_MODELVIEW);
104  mIcoSphere.draw(2);
105  gpu.popMatrix(GL_MODELVIEW);
106  }
107  glDisable(GL_NORMALIZE);
108  }
109  protected:
110  std::vector<Vector3f> mCenters;
111  std::vector<float> mRadii;
113 };
114 
115 
116 // generic linear interpolation method
117 template<typename T> T lerp(float t, const T& a, const T& b)
118 {
119  return a*(1-t) + b*t;
120 }
121 
122 // quaternion slerp
123 template<> Quaternionf lerp(float t, const Quaternionf& a, const Quaternionf& b)
124 { return a.slerp(t,b); }
125 
126 // linear interpolation of a frame using the type OrientationType
127 // to perform the interpolation of the orientations
128 template<typename OrientationType>
129 inline static Frame lerpFrame(float alpha, const Frame& a, const Frame& b)
130 {
131  return Frame(lerp(alpha,a.position,b.position),
132  Quaternionf(lerp(alpha,OrientationType(a.orientation),OrientationType(b.orientation))));
133 }
134 
135 template<typename _Scalar> class EulerAngles
136 {
137 public:
138  enum { Dim = 3 };
139  typedef _Scalar Scalar;
143 
144 protected:
145 
147 
148 public:
149 
151  inline EulerAngles(Scalar a0, Scalar a1, Scalar a2) : m_angles(a0, a1, a2) {}
152  inline EulerAngles(const QuaternionType& q) { *this = q; }
153 
154  const Vector3& coeffs() const { return m_angles; }
155  Vector3& coeffs() { return m_angles; }
156 
158  {
159  Matrix3 m = q.toRotationMatrix();
160  return *this = m;
161  }
162 
164  {
165  // mat = cy*cz -cy*sz sy
166  // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx
167  // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy
168  m_angles.coeffRef(1) = std::asin(m.coeff(0,2));
169  m_angles.coeffRef(0) = std::atan2(-m.coeff(1,2),m.coeff(2,2));
170  m_angles.coeffRef(2) = std::atan2(-m.coeff(0,1),m.coeff(0,0));
171  return *this;
172  }
173 
175  {
176  Vector3 c = m_angles.array().cos();
177  Vector3 s = m_angles.array().sin();
178  Matrix3 res;
179  res << c.y()*c.z(), -c.y()*s.z(), s.y(),
180  c.z()*s.x()*s.y()+c.x()*s.z(), c.x()*c.z()-s.x()*s.y()*s.z(), -c.y()*s.x(),
181  -c.x()*c.z()*s.y()+s.x()*s.z(), c.z()*s.x()+c.x()*s.y()*s.z(), c.x()*c.y();
182  return res;
183  }
184 
186 };
187 
188 // Euler angles slerp
189 template<> EulerAngles<float> lerp(float t, const EulerAngles<float>& a, const EulerAngles<float>& b)
190 {
191  EulerAngles<float> res;
192  res.coeffs() = lerp(t, a.coeffs(), b.coeffs());
193  return res;
194 }
195 
196 
198 {
199  mAnimate = false;
200  mCurrentTrackingMode = TM_NO_TRACK;
201  mNavMode = NavTurnAround;
202  mLerpMode = LerpQuaternion;
203  mRotationMode = RotationStable;
204  mTrackball.setCamera(&mCamera);
205 
206  // required to capture key press events
207  setFocusPolicy(Qt::ClickFocus);
208 }
209 
211 {
212  // ask user for a time
213  bool ok = false;
214  double t = 0;
215  if (!m_timeline.empty())
216  t = (--m_timeline.end())->first + 1.;
217  t = QInputDialog::getDouble(this, "Eigen's RenderingWidget", "time value: ",
218  t, 0, 1e3, 1, &ok);
219  if (ok)
220  {
221  Frame aux;
222  aux.orientation = mCamera.viewMatrix().linear();
223  aux.position = mCamera.viewMatrix().translation();
224  m_timeline[t] = aux;
225  }
226 }
227 
229 {
230  static FancySpheres sFancySpheres;
231  float length = 50;
232  gpu.drawVector(Vector3f::Zero(), length*Vector3f::UnitX(), Color(1,0,0,1));
233  gpu.drawVector(Vector3f::Zero(), length*Vector3f::UnitY(), Color(0,1,0,1));
234  gpu.drawVector(Vector3f::Zero(), length*Vector3f::UnitZ(), Color(0,0,1,1));
235 
236  // draw the fractal object
237  float sqrt3 = std::sqrt(3.);
238  glLightfv(GL_LIGHT0, GL_AMBIENT, Vector4f(0.5,0.5,0.5,1).data());
239  glLightfv(GL_LIGHT0, GL_DIFFUSE, Vector4f(0.5,1,0.5,1).data());
240  glLightfv(GL_LIGHT0, GL_SPECULAR, Vector4f(1,1,1,1).data());
241  glLightfv(GL_LIGHT0, GL_POSITION, Vector4f(-sqrt3,-sqrt3,sqrt3,0).data());
242 
243  glLightfv(GL_LIGHT1, GL_AMBIENT, Vector4f(0,0,0,1).data());
244  glLightfv(GL_LIGHT1, GL_DIFFUSE, Vector4f(1,0.5,0.5,1).data());
245  glLightfv(GL_LIGHT1, GL_SPECULAR, Vector4f(1,1,1,1).data());
246  glLightfv(GL_LIGHT1, GL_POSITION, Vector4f(-sqrt3,sqrt3,-sqrt3,0).data());
247 
248  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Vector4f(0.7, 0.7, 0.7, 1).data());
249  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Vector4f(0.8, 0.75, 0.6, 1).data());
250  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Vector4f(1, 1, 1, 1).data());
251  glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 64);
252 
253  glEnable(GL_LIGHTING);
254  glEnable(GL_LIGHT0);
255  glEnable(GL_LIGHT1);
256 
257  sFancySpheres.draw();
258  glVertexPointer(3, GL_FLOAT, 0, mVertices[0].data());
259  glNormalPointer(GL_FLOAT, 0, mNormals[0].data());
260  glEnableClientState(GL_VERTEX_ARRAY);
261  glEnableClientState(GL_NORMAL_ARRAY);
262  glDrawArrays(GL_TRIANGLES, 0, mVertices.size());
263  glDisableClientState(GL_VERTEX_ARRAY);
264  glDisableClientState(GL_NORMAL_ARRAY);
265 
266  glDisable(GL_LIGHTING);
267 }
268 
270 {
271  m_alpha += double(m_timer.interval()) * 1e-3;
272 
273  TimeLine::const_iterator hi = m_timeline.upper_bound(m_alpha);
274  TimeLine::const_iterator lo = hi;
275  --lo;
276 
277  Frame currentFrame;
278 
279  if(hi==m_timeline.end())
280  {
281  // end
282  currentFrame = lo->second;
283  stopAnimation();
284  }
285  else if(hi==m_timeline.begin())
286  {
287  // start
288  currentFrame = hi->second;
289  }
290  else
291  {
292  float s = (m_alpha - lo->first)/(hi->first - lo->first);
293  if (mLerpMode==LerpEulerAngles)
294  currentFrame = ::lerpFrame<EulerAngles<float> >(s, lo->second, hi->second);
295  else if (mLerpMode==LerpQuaternion)
296  currentFrame = ::lerpFrame<Eigen::Quaternionf>(s, lo->second, hi->second);
297  else
298  {
299  std::cerr << "Invalid rotation interpolation mode (abort)\n";
300  exit(2);
301  }
302  currentFrame.orientation.coeffs().normalize();
303  }
304 
305  currentFrame.orientation = currentFrame.orientation.inverse();
306  currentFrame.position = - (currentFrame.orientation * currentFrame.position);
307  mCamera.setFrame(currentFrame);
308 
309  updateGL();
310 }
311 
313 {
314  switch(e->key())
315  {
316  case Qt::Key_Up:
317  mCamera.zoom(2);
318  break;
319  case Qt::Key_Down:
320  mCamera.zoom(-2);
321  break;
322  // add a frame
323  case Qt::Key_G:
324  grabFrame();
325  break;
326  // clear the time line
327  case Qt::Key_C:
328  m_timeline.clear();
329  break;
330  // move the camera to initial pos
331  case Qt::Key_R:
332  resetCamera();
333  break;
334  // start/stop the animation
335  case Qt::Key_A:
336  if (mAnimate)
337  {
338  stopAnimation();
339  }
340  else
341  {
342  m_alpha = 0;
343  connect(&m_timer, SIGNAL(timeout()), this, SLOT(animate()));
344  m_timer.start(1000/30);
345  mAnimate = true;
346  }
347  break;
348  default:
349  break;
350  }
351 
352  updateGL();
353 }
354 
356 {
357  disconnect(&m_timer, SIGNAL(timeout()), this, SLOT(animate()));
358  m_timer.stop();
359  mAnimate = false;
360  m_alpha = 0;
361 }
362 
364 {
365  mMouseCoords = Vector2i(e->pos().x(), e->pos().y());
366  bool fly = (mNavMode==NavFly) || (e->modifiers()&Qt::ControlModifier);
367  switch(e->button())
368  {
369  case Qt::LeftButton:
370  if(fly)
371  {
372  mCurrentTrackingMode = TM_LOCAL_ROTATE;
373  mTrackball.start(Trackball::Local);
374  }
375  else
376  {
377  mCurrentTrackingMode = TM_ROTATE_AROUND;
378  mTrackball.start(Trackball::Around);
379  }
380  mTrackball.track(mMouseCoords);
381  break;
382  case Qt::MidButton:
383  if(fly)
384  mCurrentTrackingMode = TM_FLY_Z;
385  else
386  mCurrentTrackingMode = TM_ZOOM;
387  break;
388  case Qt::RightButton:
389  mCurrentTrackingMode = TM_FLY_PAN;
390  break;
391  default:
392  break;
393  }
394 }
396 {
397  mCurrentTrackingMode = TM_NO_TRACK;
398  updateGL();
399 }
400 
402 {
403  // tracking
404  if(mCurrentTrackingMode != TM_NO_TRACK)
405  {
406  float dx = float(e->x() - mMouseCoords.x()) / float(mCamera.vpWidth());
407  float dy = - float(e->y() - mMouseCoords.y()) / float(mCamera.vpHeight());
408 
409  // speedup the transformations
410  if(e->modifiers() & Qt::ShiftModifier)
411  {
412  dx *= 10.;
413  dy *= 10.;
414  }
415 
416  switch(mCurrentTrackingMode)
417  {
418  case TM_ROTATE_AROUND:
419  case TM_LOCAL_ROTATE:
420  if (mRotationMode==RotationStable)
421  {
422  // use the stable trackball implementation mapping
423  // the 2D coordinates to 3D points on a sphere.
424  mTrackball.track(Vector2i(e->pos().x(), e->pos().y()));
425  }
426  else
427  {
428  // standard approach mapping the x and y displacements as rotations
429  // around the camera's X and Y axes.
430  Quaternionf q = AngleAxisf( dx*M_PI, Vector3f::UnitY())
431  * AngleAxisf(-dy*M_PI, Vector3f::UnitX());
432  if (mCurrentTrackingMode==TM_LOCAL_ROTATE)
433  mCamera.localRotate(q);
434  else
435  mCamera.rotateAroundTarget(q);
436  }
437  break;
438  case TM_ZOOM :
439  mCamera.zoom(dy*100);
440  break;
441  case TM_FLY_Z :
442  mCamera.localTranslate(Vector3f(0, 0, -dy*200));
443  break;
444  case TM_FLY_PAN :
445  mCamera.localTranslate(Vector3f(dx*200, dy*200, 0));
446  break;
447  default:
448  break;
449  }
450 
451  updateGL();
452  }
453 
454  mMouseCoords = Vector2i(e->pos().x(), e->pos().y());
455 }
456 
458 {
459  glEnable(GL_DEPTH_TEST);
460  glDisable(GL_CULL_FACE);
461  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
462  glDisable(GL_COLOR_MATERIAL);
463  glDisable(GL_BLEND);
464  glDisable(GL_ALPHA_TEST);
465  glDisable(GL_TEXTURE_1D);
466  glDisable(GL_TEXTURE_2D);
467  glDisable(GL_TEXTURE_3D);
468 
469  // Clear buffers
470  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
471 
472  mCamera.activateGL();
473 
474  drawScene();
475 }
476 
478 {
479  glClearColor(1., 1., 1., 0.);
480  glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
481  glDepthMask(GL_TRUE);
482  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
483 
484  mCamera.setPosition(Vector3f(-200, -200, -200));
485  mCamera.setTarget(Vector3f(0, 0, 0));
486  mInitFrame.orientation = mCamera.orientation().inverse();
487  mInitFrame.position = mCamera.viewMatrix().translation();
488 }
489 
490 void RenderingWidget::resizeGL(int width, int height)
491 {
492  mCamera.setViewport(width,height);
493 }
494 
496 {
497  mNavMode = NavMode(m);
498 }
499 
501 {
502  mLerpMode = LerpMode(m);
503 }
504 
506 {
507  mRotationMode = RotationMode(m);
508 }
509 
511 {
512  if (mAnimate)
513  stopAnimation();
514  m_timeline.clear();
515  Frame aux0 = mCamera.frame();
516  aux0.orientation = aux0.orientation.inverse();
517  aux0.position = mCamera.viewMatrix().translation();
518  m_timeline[0] = aux0;
519 
520  Vector3f currentTarget = mCamera.target();
521  mCamera.setTarget(Vector3f::Zero());
522 
523  // compute the rotation duration to move the camera to the target
524  Frame aux1 = mCamera.frame();
525  aux1.orientation = aux1.orientation.inverse();
526  aux1.position = mCamera.viewMatrix().translation();
527  float duration = aux0.orientation.angularDistance(aux1.orientation) * 0.9;
528  if (duration<0.1) duration = 0.1;
529 
530  // put the camera at that time step:
531  aux1 = aux0.lerp(duration/2,mInitFrame);
532  // and make it look at the target again
533  aux1.orientation = aux1.orientation.inverse();
534  aux1.position = - (aux1.orientation * aux1.position);
535  mCamera.setFrame(aux1);
536  mCamera.setTarget(Vector3f::Zero());
537 
538  // add this camera keyframe
539  aux1.orientation = aux1.orientation.inverse();
540  aux1.position = mCamera.viewMatrix().translation();
541  m_timeline[duration] = aux1;
542 
543  m_timeline[2] = mInitFrame;
544  m_alpha = 0;
545  animate();
546  connect(&m_timer, SIGNAL(timeout()), this, SLOT(animate()));
547  m_timer.start(1000/30);
548  mAnimate = true;
549 }
550 
552 {
553  QWidget* panel = new QWidget();
554  QVBoxLayout* layout = new QVBoxLayout();
555 
556  {
557  QPushButton* but = new QPushButton("reset");
558  but->setToolTip("move the camera to initial position (with animation)");
559  layout->addWidget(but);
560  connect(but, SIGNAL(clicked()), this, SLOT(resetCamera()));
561  }
562  {
563  // navigation mode
564  QGroupBox* box = new QGroupBox("navigation mode");
565  QVBoxLayout* boxLayout = new QVBoxLayout;
566  QButtonGroup* group = new QButtonGroup(panel);
567  QRadioButton* but;
568  but = new QRadioButton("turn around");
569  but->setToolTip("look around an object");
570  group->addButton(but, NavTurnAround);
571  boxLayout->addWidget(but);
572  but = new QRadioButton("fly");
573  but->setToolTip("free navigation like a spaceship\n(this mode can also be enabled pressing the \"shift\" key)");
574  group->addButton(but, NavFly);
575  boxLayout->addWidget(but);
576  group->button(mNavMode)->setChecked(true);
577  connect(group, SIGNAL(buttonClicked(int)), this, SLOT(setNavMode(int)));
578  box->setLayout(boxLayout);
579  layout->addWidget(box);
580  }
581  {
582  // track ball, rotation mode
583  QGroupBox* box = new QGroupBox("rotation mode");
584  QVBoxLayout* boxLayout = new QVBoxLayout;
585  QButtonGroup* group = new QButtonGroup(panel);
586  QRadioButton* but;
587  but = new QRadioButton("stable trackball");
588  group->addButton(but, RotationStable);
589  boxLayout->addWidget(but);
590  but->setToolTip("use the stable trackball implementation mapping\nthe 2D coordinates to 3D points on a sphere");
591  but = new QRadioButton("standard rotation");
592  group->addButton(but, RotationStandard);
593  boxLayout->addWidget(but);
594  but->setToolTip("standard approach mapping the x and y displacements\nas rotations around the camera's X and Y axes");
595  group->button(mRotationMode)->setChecked(true);
596  connect(group, SIGNAL(buttonClicked(int)), this, SLOT(setRotationMode(int)));
597  box->setLayout(boxLayout);
598  layout->addWidget(box);
599  }
600  {
601  // interpolation mode
602  QGroupBox* box = new QGroupBox("spherical interpolation");
603  QVBoxLayout* boxLayout = new QVBoxLayout;
604  QButtonGroup* group = new QButtonGroup(panel);
605  QRadioButton* but;
606  but = new QRadioButton("quaternion slerp");
607  group->addButton(but, LerpQuaternion);
608  boxLayout->addWidget(but);
609  but->setToolTip("use quaternion spherical interpolation\nto interpolate orientations");
610  but = new QRadioButton("euler angles");
611  group->addButton(but, LerpEulerAngles);
612  boxLayout->addWidget(but);
613  but->setToolTip("use Euler angles to interpolate orientations");
614  group->button(mNavMode)->setChecked(true);
615  connect(group, SIGNAL(buttonClicked(int)), this, SLOT(setLerpMode(int)));
616  box->setLayout(boxLayout);
617  layout->addWidget(box);
618  }
619  layout->addItem(new QSpacerItem(0,0,QSizePolicy::Minimum,QSizePolicy::Expanding));
620  panel->setLayout(layout);
621  return panel;
622 }
623 
625 {
626  mRenderingWidget = new RenderingWidget();
627  setCentralWidget(mRenderingWidget);
628 
629  QDockWidget* panel = new QDockWidget("navigation", this);
630  panel->setAllowedAreas((QFlags<Qt::DockWidgetArea>)(Qt::RightDockWidgetArea | Qt::LeftDockWidgetArea));
631  addDockWidget(Qt::RightDockWidgetArea, panel);
632  panel->setWidget(mRenderingWidget->createNavigationControlWidget());
633 }
634 
635 int main(int argc, char *argv[])
636 {
637  std::cout << "Navigation:\n";
638  std::cout << " left button: rotate around the target\n";
639  std::cout << " middle button: zoom\n";
640  std::cout << " left button + ctrl quake rotate (rotate around camera position)\n";
641  std::cout << " middle button + ctrl walk (progress along camera's z direction)\n";
642  std::cout << " left button: pan (translate in the XY camera's plane)\n\n";
643  std::cout << "R : move the camera to initial position\n";
644  std::cout << "A : start/stop animation\n";
645  std::cout << "C : clear the animation\n";
646  std::cout << "G : add a key frame\n";
647 
648  QApplication app(argc, argv);
649  QuaternionDemo demo;
650  demo.resize(600,500);
651  demo.show();
652  return app.exec();
653 }
654 
655 #include "quaternion_demo.moc"
656 
QuaternionDemo
Definition: quaternion_demo.h:105
IcoSphere
Definition: icosphere.h:16
Eigen::EulerAngles
Represents a rotation in a 3 dimensional space as three Euler angles.
Definition: unsupported/Eigen/src/EulerAngles/EulerAngles.h:111
FancySpheres::mIcoSphere
IcoSphere mIcoSphere
Definition: quaternion_demo.cpp:112
sqrt
const EIGEN_DEVICE_FUNC SqrtReturnType sqrt() const
Definition: ArrayCwiseUnaryOps.h:152
EulerAngles::EulerAngles
EulerAngles(Scalar a0, Scalar a1, Scalar a2)
Definition: quaternion_demo.cpp:151
Eigen::Translation3f
Translation< float, 3 > Translation3f
Definition: Translation.h:176
Eigen
Definition: common.h:73
EulerAngles::toRotationMatrix
Matrix3 toRotationMatrix(void) const
Definition: quaternion_demo.cpp:174
Eigen::Quaternion::coeffs
EIGEN_DEVICE_FUNC Coefficients & coeffs()
Definition: Quaternion.h:284
FancySpheres::mCenters
std::vector< Vector3f > mCenters
Definition: quaternion_demo.cpp:110
RenderingWidget::LerpMode
LerpMode
Definition: quaternion_demo.h:44
Eigen::EulerAngles::toRotationMatrix
Matrix3 toRotationMatrix() const
Definition: unsupported/Eigen/src/EulerAngles/EulerAngles.h:331
b
Scalar * b
Definition: cholesky.cpp:56
Eigen::atan2
const AutoDiffScalar< Matrix< typename internal::traits< typename internal::remove_all< DerTypeA >::type >::Scalar, Dynamic, 1 > > atan2(const AutoDiffScalar< DerTypeA > &a, const AutoDiffScalar< DerTypeB > &b)
Definition: AutoDiffScalar.h:623
FancySpheres
Definition: quaternion_demo.cpp:30
Eigen::Transform
Represents an homogeneous transformation in a N dimensional space.
Definition: ForwardDeclarations.h:274
alpha
RealScalar alpha
Definition: level1_cplx_impl.h:125
s
RealScalar s
Definition: level1_cplx_impl.h:104
Frame::position
Eigen::Vector3f position
Definition: camera.h:33
RenderingWidget::RenderingWidget
EIGEN_MAKE_ALIGNED_OPERATOR_NEW RenderingWidget()
Definition: quaternion_demo.cpp:197
Trackball::Local
@ Local
Definition: trackball.h:21
lerpFrame
static Frame lerpFrame(float alpha, const Frame &a, const Frame &b)
Definition: quaternion_demo.cpp:129
Eigen::RotationBase< EulerAngles< _Scalar, _System >, 3 >::Dim
@ Dim
Definition: RotationBase.h:32
Frame::lerp
Frame lerp(float alpha, const Frame &other) const
Definition: camera.h:26
Eigen::Scaling
UniformScaling< float > Scaling(float s)
Definition: Eigen/src/Geometry/Scaling.h:121
main
int main(int argc, char *argv[])
Definition: quaternion_demo.cpp:635
Eigen::EulerAngles::QuaternionType
Quaternion< Scalar > QuaternionType
Definition: unsupported/Eigen/src/EulerAngles/EulerAngles.h:122
QuaternionDemo::QuaternionDemo
QuaternionDemo()
Definition: quaternion_demo.cpp:624
RenderingWidget::resizeGL
virtual void resizeGL(int width, int height)
Definition: quaternion_demo.cpp:490
asin
const EIGEN_DEVICE_FUNC AsinReturnType asin() const
Definition: ArrayCwiseUnaryOps.h:276
Frame
Definition: camera.h:17
Trackball::Around
@ Around
Definition: trackball.h:21
EulerAngles::Matrix3
Matrix< Scalar, 3, 3 > Matrix3
Definition: quaternion_demo.cpp:140
FancySpheres::draw
void draw()
Definition: quaternion_demo.cpp:95
EulerAngles::coeffs
Vector3 & coeffs()
Definition: quaternion_demo.cpp:155
icosphere.h
GpuHelper::drawVector
void drawVector(const Vector3f &position, const Vector3f &vec, const Color &color, float aspect=50.)
Definition: gpuhelper.cpp:56
Frame::orientation
Eigen::Quaternionf orientation
Definition: camera.h:32
Eigen::numext::q
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:1520
RenderingWidget::resetCamera
virtual void resetCamera()
Definition: quaternion_demo.cpp:510
RenderingWidget::setNavMode
virtual void setNavMode(int)
Definition: quaternion_demo.cpp:495
RenderingWidget::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
Definition: quaternion_demo.cpp:312
RenderingWidget::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *e)
Definition: quaternion_demo.cpp:395
RenderingWidget::setLerpMode
virtual void setLerpMode(int)
Definition: quaternion_demo.cpp:500
EulerAngles::operator=
EulerAngles & operator=(const QuaternionType &q)
Definition: quaternion_demo.cpp:157
RenderingWidget::grabFrame
virtual void grabFrame(void)
Definition: quaternion_demo.cpp:210
RenderingWidget::RotationMode
RotationMode
Definition: quaternion_demo.h:49
EulerAngles::QuaternionType
Quaternion< Scalar > QuaternionType
Definition: quaternion_demo.cpp:142
EulerAngles::EulerAngles
EulerAngles()
Definition: quaternion_demo.cpp:150
Eigen::Matrix::coeffRef
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
Definition: PlainObjectBase.h:183
RenderingWidget::animate
virtual void animate(void)
Definition: quaternion_demo.cpp:269
lerp
T lerp(float t, const T &a, const T &b)
Definition: quaternion_demo.cpp:117
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Definition: Memory.h:690
RenderingWidget::mousePressEvent
virtual void mousePressEvent(QMouseEvent *e)
Definition: quaternion_demo.cpp:363
GpuHelper::popMatrix
void popMatrix(GLenum matrixTarget)
Definition: gpuhelper.h:185
EulerAngles::operator=
EulerAngles & operator=(const Matrix3 &m)
Definition: quaternion_demo.cpp:163
Eigen::AngleAxisf
AngleAxis< float > AngleAxisf
Definition: AngleAxis.h:157
EulerAngles::EulerAngles
EulerAngles(const QuaternionType &q)
Definition: quaternion_demo.cpp:152
Eigen::Transform::matrix
const EIGEN_DEVICE_FUNC MatrixType & matrix() const
Definition: Transform.h:395
Eigen::Quaternion
The quaternion class used to represent 3D orientations and rotations.
Definition: ForwardDeclarations.h:273
Eigen::EulerAngles::m_angles
Vector3 m_angles
Definition: unsupported/Eigen/src/EulerAngles/EulerAngles.h:144
c
RealScalar c
Definition: level1_cplx_impl.h:103
EulerAngles::coeffs
const Vector3 & coeffs() const
Definition: quaternion_demo.cpp:154
Color
Vector4f Color
Definition: gpuhelper.h:19
FancySpheres::mRadii
std::vector< float > mRadii
Definition: quaternion_demo.cpp:111
a
Scalar * a
Definition: cholesky.cpp:26
RenderingWidget::initializeGL
virtual void initializeGL()
Definition: quaternion_demo.cpp:477
RenderingWidget
Definition: quaternion_demo.h:22
Eigen::PlainObjectBase::coeff
EIGEN_DEVICE_FUNC const EIGEN_STRONG_INLINE Scalar & coeff(Index rowId, Index colId) const
Definition: PlainObjectBase.h:160
RenderingWidget::mouseMoveEvent
virtual void mouseMoveEvent(QMouseEvent *e)
Definition: quaternion_demo.cpp:401
EulerAngles::Vector3
Matrix< Scalar, 3, 1 > Vector3
Definition: quaternion_demo.cpp:141
RenderingWidget::setRotationMode
virtual void setRotationMode(int)
Definition: quaternion_demo.cpp:505
RenderingWidget::drawScene
virtual void drawScene(void)
Definition: quaternion_demo.cpp:228
EulerAngles::m_angles
Vector3 m_angles
Definition: quaternion_demo.cpp:146
Eigen::Matrix
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:178
RenderingWidget::NavMode
NavMode
Definition: quaternion_demo.h:39
EulerAngles::Scalar
_Scalar Scalar
Definition: quaternion_demo.cpp:139
gpu
GpuHelper gpu
Definition: gpuhelper.cpp:18
corbo::ok
bool ok()
global method to check whether to proceed or cancel the current action
Definition: global.cpp:54
GpuHelper::pushMatrix
void pushMatrix(const Matrix< Scalar, 4, 4, _Flags, 4, 4 > &mat, GLenum matrixTarget)
Definition: gpuhelper.h:170
FancySpheres::FancySpheres
EIGEN_MAKE_ALIGNED_OPERATOR_NEW FancySpheres()
Definition: quaternion_demo.cpp:35
RenderingWidget::paintGL
virtual void paintGL()
Definition: quaternion_demo.cpp:457
GpuHelper::multMatrix
void multMatrix(const Matrix< Scalar, 4, 4, _Flags, 4, 4 > &mat, GLenum matrixTarget)
Definition: gpuhelper.h:141
quaternion_demo.h
RenderingWidget::stopAnimation
virtual void stopAnimation()
Definition: quaternion_demo.cpp:355
RenderingWidget::createNavigationControlWidget
QWidget * createNavigationControlWidget()
Definition: quaternion_demo.cpp:551


control_box_rst
Author(s): Christoph Rösmann
autogenerated on Wed Mar 2 2022 00:06:08