frame.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 
3  Copyright (C) 2002-2014 Gilles Debunne. All rights reserved.
4 
5  This file is part of the QGLViewer library version 2.6.3.
6 
7  http://www.libqglviewer.com - contact@libqglviewer.com
8 
9  This file may be used under the terms of the GNU General Public License
10  versions 2.0 or 3.0 as published by the Free Software Foundation and
11  appearing in the LICENSE file included in the packaging of this file.
12  In addition, as a special exception, Gilles Debunne gives you certain
13  additional rights, described in the file GPL_EXCEPTION in this package.
14 
15  libQGLViewer uses dual licensing. Commercial/proprietary software must
16  purchase a libQGLViewer Commercial License.
17 
18  This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
19  WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 
21 *****************************************************************************/
22 
23 #include "domUtils.h"
24 #include "frame.h"
25 #include <math.h>
26 
27 using namespace qglviewer;
28 using namespace std;
29 
30 
36  : constraint_(NULL), referenceFrame_(NULL)
37 {}
38 
46  : t_(position), q_(orientation), constraint_(NULL), referenceFrame_(NULL)
47 {}
48 
55 {
56  // Automatic compiler generated version would not emit the modified() signals as is done in
57  // setTranslationAndRotation.
59  setConstraint(frame.constraint());
61  return *this;
62 }
63 
68 Frame::Frame(const Frame& frame)
69  : QObject()
70 {
71  (*this) = frame;
72 }
73 
75 
123 const GLdouble* Frame::matrix() const
124 {
125  static GLdouble m[4][4];
126  getMatrix(m);
127  return (const GLdouble*)(m);
128 }
129 
131 void Frame::getMatrix(GLdouble m[4][4]) const
132 {
133  q_.getMatrix(m);
134 
135  m[3][0] = t_[0];
136  m[3][1] = t_[1];
137  m[3][2] = t_[2];
138 }
139 
141 void Frame::getMatrix(GLdouble m[16]) const
142 {
143  q_.getMatrix(m);
144 
145  m[12] = t_[0];
146  m[13] = t_[1];
147  m[14] = t_[2];
148 }
149 
165 {
166  Frame fr(-(q_.inverseRotate(t_)), q_.inverse());
168  return fr;
169 }
170 
196 const GLdouble* Frame::worldMatrix() const
197 {
198  // This test is done for efficiency reasons (creates lots of temp objects otherwise).
199  if (referenceFrame())
200  {
201  static Frame fr;
202  fr.setTranslation(position());
203  fr.setRotation(orientation());
204  return fr.matrix();
205  }
206  else
207  return matrix();
208 }
209 
211 void Frame::getWorldMatrix(GLdouble m[4][4]) const
212 {
213  const GLdouble* mat = worldMatrix();
214  for (int i=0; i<4; ++i)
215  for (int j=0; j<4; ++j)
216  m[i][j] = mat[i*4+j];
217 }
218 
220 void Frame::getWorldMatrix(GLdouble m[16]) const
221 {
222  const GLdouble* mat = worldMatrix();
223  for (int i=0; i<16; ++i)
224  m[i] = mat[i];
225 }
226 
228 void Frame::setFromMatrix(const GLdouble m[4][4])
229 {
230  if (fabs(m[3][3]) < 1E-8)
231  {
232  qWarning("Frame::setFromMatrix: Null homogeneous coefficient");
233  return;
234  }
235 
236  qreal rot[3][3];
237  for (int i=0; i<3; ++i)
238  {
239  t_[i] = m[3][i] / m[3][3];
240  for (int j=0; j<3; ++j)
241  // Beware of the transposition (OpenGL to European math)
242  rot[i][j] = m[j][i] / m[3][3];
243  }
245  Q_EMIT modified();
246 }
247 
272 void Frame::setFromMatrix(const GLdouble m[16])
273 {
274  GLdouble mat[4][4];
275  for (int i=0; i<4; ++i)
276  for (int j=0; j<4; ++j)
277  mat[i][j] = m[i*4+j];
278  setFromMatrix(mat);
279 }
280 
282 
283 
285 void Frame::setTranslation(qreal x, qreal y, qreal z)
286 {
287  setTranslation(Vec(x, y, z));
288 }
289 
291 void Frame::getTranslation(qreal& x, qreal& y, qreal& z) const
292 {
293  const Vec t = translation();
294  x = t[0];
295  y = t[1];
296  z = t[2];
297 }
298 
300 void Frame::setRotation(qreal q0, qreal q1, qreal q2, qreal q3)
301 {
302  setRotation(Quaternion(q0, q1, q2, q3));
303 }
304 
308 void Frame::getRotation(qreal& q0, qreal& q1, qreal& q2, qreal& q3) const
309 {
310  const Quaternion q = rotation();
311  q0 = q[0];
312  q1 = q[1];
313  q2 = q[2];
314  q3 = q[3];
315 }
316 
318 
327 void Frame::translate(const Vec& t)
328 {
329  Vec tbis = t;
330  translate(tbis);
331 }
332 
336 {
337  if (constraint())
338  constraint()->constrainTranslation(t, this);
339  t_ += t;
340  Q_EMIT modified();
341 }
342 
344 void Frame::translate(qreal x, qreal y, qreal z)
345 {
346  Vec t(x,y,z);
347  translate(t);
348 }
349 
351 void Frame::translate(qreal& x, qreal& y, qreal& z)
352 {
353  Vec t(x,y,z);
354  translate(t);
355  x = t[0];
356  y = t[1];
357  z = t[2];
358 }
359 
368 void Frame::rotate(const Quaternion& q)
369 {
370  Quaternion qbis = q;
371  rotate(qbis);
372 }
373 
377 {
378  if (constraint())
379  constraint()->constrainRotation(q, this);
380  q_ *= q;
381  q_.normalize(); // Prevents numerical drift
382  Q_EMIT modified();
383 }
384 
386 void Frame::rotate(qreal& q0, qreal& q1, qreal& q2, qreal& q3)
387 {
388  Quaternion q(q0,q1,q2,q3);
389  rotate(q);
390  q0 = q[0];
391  q1 = q[1];
392  q2 = q[2];
393  q3 = q[3];
394 }
395 
397 void Frame::rotate(qreal q0, qreal q1, qreal q2, qreal q3)
398 {
399  Quaternion q(q0,q1,q2,q3);
400  rotate(q);
401 }
402 
415 {
416  if (constraint())
417  constraint()->constrainRotation(rotation, this);
418  q_ *= rotation;
419  q_.normalize(); // Prevents numerical drift
420  Vec trans = point + Quaternion(inverseTransformOf(rotation.axis()), rotation.angle()).rotate(position()-point) - t_;
421  if (constraint())
422  constraint()->constrainTranslation(trans, this);
423  t_ += trans;
424  Q_EMIT modified();
425 }
426 
430 {
431  Quaternion rot = rotation;
432  rotateAroundPoint(rot, point);
433 }
434 
436 
444 {
445  if (referenceFrame())
447  else
448  setTranslation(position);
449 }
450 
452 void Frame::setPosition(qreal x, qreal y, qreal z)
453 {
454  setPosition(Vec(x, y, z));
455 }
456 
463 {
464  if (referenceFrame())
465  {
466  t_ = referenceFrame()->coordinatesOf(position);
468  }
469  else
470  {
471  t_ = position;
472  q_ = orientation;
473  }
474  Q_EMIT modified();
475 }
476 
477 
484 {
485  t_ = translation;
486  q_ = rotation;
487  Q_EMIT modified();
488 }
489 
490 
492 void Frame::getPosition(qreal& x, qreal& y, qreal& z) const
493 {
494  Vec p = position();
495  x = p.x;
496  y = p.y;
497  z = p.z;
498 }
499 
506 {
507  if (referenceFrame())
508  setRotation(referenceFrame()->orientation().inverse() * orientation);
509  else
510  setRotation(orientation);
511 }
512 
514 void Frame::setOrientation(qreal q0, qreal q1, qreal q2, qreal q3)
515 {
516  setOrientation(Quaternion(q0, q1, q2, q3));
517 }
518 
526 void Frame::getOrientation(qreal& q0, qreal& q1, qreal& q2, qreal& q3) const
527 {
528  Quaternion o = orientation();
529  q0 = o[0];
530  q1 = o[1];
531  q2 = o[2];
532  q3 = o[3];
533 }
534 
538  if (referenceFrame_)
539  return inverseCoordinatesOf(Vec(0.0,0.0,0.0));
540  else
541  return t_;
542 }
543 
547 {
548  Quaternion res = rotation();
549  const Frame* fr = referenceFrame();
550  while (fr != NULL)
551  {
552  res = fr->rotation() * res;
553  fr = fr->referenceFrame();
554  }
555  return res;
556 }
557 
558 
560 
566 {
567  Vec deltaT = translation - this->translation();
568  if (constraint())
569  constraint()->constrainTranslation(deltaT, this);
570 
571  setTranslation(this->translation() + deltaT);
572  translation = this->translation();
573 }
574 
580 {
581  Quaternion deltaQ = this->rotation().inverse() * rotation;
582  if (constraint())
583  constraint()->constrainRotation(deltaQ, this);
584 
585  // Prevent numerical drift
586  deltaQ.normalize();
587 
588  setRotation(this->rotation() * deltaQ);
589  q_.normalize();
590  rotation = this->rotation();
591 }
592 
596 {
597  Vec deltaT = translation - this->translation();
598  Quaternion deltaQ = this->rotation().inverse() * rotation;
599 
600  if (constraint())
601  {
602  constraint()->constrainTranslation(deltaT, this);
603  constraint()->constrainRotation(deltaQ, this);
604  }
605 
606  // Prevent numerical drift
607  deltaQ.normalize();
608 
609  t_ += deltaT;
610  q_ *= deltaQ;
611  q_.normalize();
612 
613  translation = this->translation();
614  rotation = this->rotation();
615 
616  Q_EMIT modified();
617 }
618 
622 {
623  if (referenceFrame())
624  position = referenceFrame()->coordinatesOf(position);
625 
627 }
628 
632 {
633  if (referenceFrame())
634  orientation = referenceFrame()->orientation().inverse() * orientation;
635 
636  setRotationWithConstraint(orientation);
637 }
638 
642 {
643  if (referenceFrame())
644  {
645  position = referenceFrame()->coordinatesOf(position);
646  orientation = referenceFrame()->orientation().inverse() * orientation;
647  }
648  setTranslationAndRotationWithConstraint(position, orientation);
649 }
650 
651 
653 
665 void Frame::setReferenceFrame(const Frame* const refFrame)
666 {
668  qWarning("Frame::setReferenceFrame would create a loop in Frame hierarchy");
669  else
670  {
671  bool identical = (referenceFrame_ == refFrame);
672  referenceFrame_ = refFrame;
673  if (!identical)
674  Q_EMIT modified();
675  }
676 }
677 
681 {
682  const Frame* f = frame;
683  while (f != NULL)
684  {
685  if (f == this)
686  return true;
687  f = f->referenceFrame();
688  }
689  return false;
690 }
691 
693 
702 Vec Frame::coordinatesOf(const Vec& src) const
703 {
704  if (referenceFrame())
706  else
707  return localCoordinatesOf(src);
708 }
709 
716 {
717  const Frame* fr = this;
718  Vec res = src;
719  while (fr != NULL)
720  {
721  res = fr->localInverseCoordinatesOf(res);
722  fr = fr->referenceFrame();
723  }
724  return res;
725 }
726 
732 {
733  return rotation().inverseRotate(src - translation());
734 }
735 
741 {
742  return rotation().rotate(src) + translation();
743 }
744 
749 Vec Frame::coordinatesOfFrom(const Vec& src, const Frame* const from) const
750 {
751  if (this == from)
752  return src;
753  else
754  if (referenceFrame())
756  else
757  return localCoordinatesOf(from->inverseCoordinatesOf(src));
758 }
759 
764 Vec Frame::coordinatesOfIn(const Vec& src, const Frame* const in) const
765 {
766  const Frame* fr = this;
767  Vec res = src;
768  while ((fr != NULL) && (fr != in))
769  {
770  res = fr->localInverseCoordinatesOf(res);
771  fr = fr->referenceFrame();
772  }
773 
774  if (fr != in)
775  // in was not found in the branch of this, res is now expressed in the world
776  // coordinate system. Simply convert to in coordinate system.
777  res = in->coordinatesOf(res);
778 
779  return res;
780 }
781 
783 
785 void Frame::getCoordinatesOf(const qreal src[3], qreal res[3]) const
786 {
787  const Vec r = coordinatesOf(Vec(src));
788  for (int i=0; i<3 ; ++i)
789  res[i] = r[i];
790 }
791 
793 void Frame::getInverseCoordinatesOf(const qreal src[3], qreal res[3]) const
794 {
795  const Vec r = inverseCoordinatesOf(Vec(src));
796  for (int i=0; i<3 ; ++i)
797  res[i] = r[i];
798 }
799 
801 void Frame::getLocalCoordinatesOf(const qreal src[3], qreal res[3]) const
802 {
803  const Vec r = localCoordinatesOf(Vec(src));
804  for (int i=0; i<3 ; ++i)
805  res[i] = r[i];
806 }
807 
809 void Frame::getLocalInverseCoordinatesOf(const qreal src[3], qreal res[3]) const
810 {
811  const Vec r = localInverseCoordinatesOf(Vec(src));
812  for (int i=0; i<3 ; ++i)
813  res[i] = r[i];
814 }
815 
817 void Frame::getCoordinatesOfIn(const qreal src[3], qreal res[3], const Frame* const in) const
818 {
819  const Vec r = coordinatesOfIn(Vec(src), in);
820  for (int i=0; i<3 ; ++i)
821  res[i] = r[i];
822 }
823 
825 void Frame::getCoordinatesOfFrom(const qreal src[3], qreal res[3], const Frame* const from) const
826 {
827  const Vec r = coordinatesOfFrom(Vec(src), from);
828  for (int i=0; i<3 ; ++i)
829  res[i] = r[i];
830 }
831 
832 
834 
843 Vec Frame::transformOf(const Vec& src) const
844 {
845  if (referenceFrame())
847  else
848  return localTransformOf(src);
849 }
850 
857 {
858  const Frame* fr = this;
859  Vec res = src;
860  while (fr != NULL)
861  {
862  res = fr->localInverseTransformOf(res);
863  fr = fr->referenceFrame();
864  }
865  return res;
866 }
867 
872 Vec Frame::localTransformOf(const Vec& src) const
873 {
874  return rotation().inverseRotate(src);
875 }
876 
882 {
883  return rotation().rotate(src);
884 }
885 
890 Vec Frame::transformOfFrom(const Vec& src, const Frame* const from) const
891 {
892  if (this == from)
893  return src;
894  else
895  if (referenceFrame())
896  return localTransformOf(referenceFrame()->transformOfFrom(src, from));
897  else
898  return localTransformOf(from->inverseTransformOf(src));
899 }
900 
905 Vec Frame::transformOfIn(const Vec& src, const Frame* const in) const
906 {
907  const Frame* fr = this;
908  Vec res = src;
909  while ((fr != NULL) && (fr != in))
910  {
911  res = fr->localInverseTransformOf(res);
912  fr = fr->referenceFrame();
913  }
914 
915  if (fr != in)
916  // in was not found in the branch of this, res is now expressed in the world
917  // coordinate system. Simply convert to in coordinate system.
918  res = in->transformOf(res);
919 
920  return res;
921 }
922 
924 
926 void Frame::getTransformOf(const qreal src[3], qreal res[3]) const
927 {
928  Vec r = transformOf(Vec(src));
929  for (int i=0; i<3 ; ++i)
930  res[i] = r[i];
931 }
932 
934 void Frame::getInverseTransformOf(const qreal src[3], qreal res[3]) const
935 {
936  Vec r = inverseTransformOf(Vec(src));
937  for (int i=0; i<3 ; ++i)
938  res[i] = r[i];
939 }
940 
942 void Frame::getLocalTransformOf(const qreal src[3], qreal res[3]) const
943 {
944  Vec r = localTransformOf(Vec(src));
945  for (int i=0; i<3 ; ++i)
946  res[i] = r[i];
947 }
948 
950 void Frame::getLocalInverseTransformOf(const qreal src[3], qreal res[3]) const
951 {
952  Vec r = localInverseTransformOf(Vec(src));
953  for (int i=0; i<3 ; ++i)
954  res[i] = r[i];
955 }
956 
958 void Frame::getTransformOfIn(const qreal src[3], qreal res[3], const Frame* const in) const
959 {
960  Vec r = transformOfIn(Vec(src), in);
961  for (int i=0; i<3 ; ++i)
962  res[i] = r[i];
963 }
964 
966 void Frame::getTransformOfFrom(const qreal src[3], qreal res[3], const Frame* const from) const
967 {
968  Vec r = transformOfFrom(Vec(src), from);
969  for (int i=0; i<3 ; ++i)
970  res[i] = r[i];
971 }
972 
974 
994 QDomElement Frame::domElement(const QString& name, QDomDocument& document) const
995 {
996  // TODO: use translation and rotation instead when referenceFrame is coded...
997  QDomElement e = document.createElement(name);
998  e.appendChild(position().domElement("position", document));
999  e.appendChild(orientation().domElement("orientation", document));
1000  return e;
1001 }
1002 
1011 void Frame::initFromDOMElement(const QDomElement& element)
1012 {
1013  // TODO: use translation and rotation instead when referenceFrame is coded...
1014 
1015  // Reset default values. Attention: destroys constraint.
1016  // *this = Frame();
1017  // This instead ? Better : what is not set is not changed.
1018  // setPositionAndOrientation(Vec(), Quaternion());
1019 
1020  QDomElement child=element.firstChild().toElement();
1021  while (!child.isNull())
1022  {
1023  if (child.tagName() == "position")
1024  setPosition(Vec(child));
1025  if (child.tagName() == "orientation")
1027 
1028  child = child.nextSibling().toElement();
1029  }
1030 }
1031 
1033 
1055 void Frame::alignWithFrame(const Frame* const frame, bool move, qreal threshold)
1056 {
1057  Vec directions[2][3];
1058  for (unsigned short d=0; d<3; ++d)
1059  {
1060  Vec dir((d==0)? 1.0 : 0.0, (d==1)? 1.0 : 0.0, (d==2)? 1.0 : 0.0);
1061  if (frame)
1062  directions[0][d] = frame->inverseTransformOf(dir);
1063  else
1064  directions[0][d] = dir;
1065  directions[1][d] = inverseTransformOf(dir);
1066  }
1067 
1068  qreal maxProj = 0.0;
1069  qreal proj;
1070  unsigned short index[2];
1071  index[0] = index[1] = 0;
1072  for (unsigned short i=0; i<3; ++i)
1073  for (unsigned short j=0; j<3; ++j)
1074  if ( (proj=fabs(directions[0][i]*directions[1][j])) >= maxProj )
1075  {
1076  index[0] = i;
1077  index[1] = j;
1078  maxProj = proj;
1079  }
1080 
1081  Frame old;
1082  old=*this;
1083 
1084  qreal coef = directions[0][index[0]] * directions[1][index[1]];
1085  if (fabs(coef) >= threshold)
1086  {
1087  const Vec axis = cross(directions[0][index[0]], directions[1][index[1]]);
1088  qreal angle = asin(axis.norm());
1089  if (coef >= 0.0)
1090  angle = -angle;
1091  rotate(rotation().inverse() * Quaternion(axis, angle) * orientation());
1092 
1093  // Try to align an other axis direction
1094  unsigned short d = (index[1]+1) % 3;
1095  Vec dir((d==0)? 1.0 : 0.0, (d==1)? 1.0 : 0.0, (d==2)? 1.0 : 0.0);
1096  dir = inverseTransformOf(dir);
1097 
1098  qreal max = 0.0;
1099  for (unsigned short i=0; i<3; ++i)
1100  {
1101  qreal proj = fabs(directions[0][i]*dir);
1102  if (proj > max)
1103  {
1104  index[0] = i;
1105  max = proj;
1106  }
1107  }
1108 
1109  if (max >= threshold)
1110  {
1111  const Vec axis = cross(directions[0][index[0]], dir);
1112  qreal angle = asin(axis.norm());
1113  if (directions[0][index[0]] * dir >= 0.0)
1114  angle = -angle;
1115  rotate(rotation().inverse() * Quaternion(axis, angle) * orientation());
1116  }
1117  }
1118 
1119  if (move)
1120  {
1121  Vec center;
1122  if (frame)
1123  center = frame->position();
1124 
1125  translate(center - orientation().rotate(old.coordinatesOf(center)) - translation());
1126  }
1127 }
1128 
1133 void Frame::projectOnLine(const Vec& origin, const Vec& direction)
1134 {
1135  // If you are trying to find a bug here, because of memory problems, you waste your time.
1136  // This is a bug in the gcc 3.3 compiler. Compile the library in debug mode and test.
1137  // Uncommenting this line also seems to solve the problem. Horrible.
1138  // cout << "position = " << position() << endl;
1139  // If you found a problem or are using a different compiler, please let me know.
1140  const Vec shift = origin - position();
1141  Vec proj = shift;
1142  proj.projectOnAxis(direction);
1143  translate(shift-proj);
1144 }
Quaternion inverse() const
Definition: quaternion.h:205
Vec position() const
Definition: frame.cpp:537
Vec transformOfIn(const Vec &src, const Frame *const in) const
Definition: frame.cpp:905
Constraint * constraint_
Definition: frame.h:407
Vec inverseTransformOf(const Vec &src) const
Definition: frame.cpp:856
qreal norm() const
Definition: vec.h:335
void getInverseTransformOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:934
qreal angle() const
Definition: quaternion.cpp:234
void getMatrix(GLdouble m[4][4]) const
Definition: frame.cpp:131
void getCoordinatesOfIn(const qreal src[3], qreal res[3], const Frame *const in) const
Definition: frame.cpp:817
void getLocalInverseCoordinatesOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:809
Vec localInverseCoordinatesOf(const Vec &src) const
Definition: frame.cpp:740
void getLocalInverseTransformOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:950
Vec transformOf(const Vec &src) const
Definition: frame.cpp:843
void setPositionWithConstraint(Vec &position)
Definition: frame.cpp:621
void getTransformOfFrom(const qreal src[3], qreal res[3], const Frame *const from) const
Definition: frame.cpp:966
void setRotationWithConstraint(Quaternion &rotation)
Definition: frame.cpp:579
virtual QDomElement domElement(const QString &name, QDomDocument &document) const
Definition: frame.cpp:994
void getCoordinatesOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:785
Vec rotate(const Vec &v) const
Definition: quaternion.cpp:76
void getWorldMatrix(GLdouble m[4][4]) const
Definition: frame.cpp:211
void getLocalCoordinatesOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:801
virtual void constrainTranslation(Vec &translation, Frame *const frame)
Definition: constraint.h:133
void setConstraint(Constraint *const constraint)
Definition: frame.h:361
void getTransformOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:926
void setTranslationWithConstraint(Vec &translation)
Definition: frame.cpp:565
Vec inverseRotate(const Vec &v) const
Definition: quaternion.cpp:68
void getTransformOfIn(const qreal src[3], qreal res[3], const Frame *const in) const
Definition: frame.cpp:958
void setFromRotationMatrix(const float m[3][3])
Definition: quaternion.cpp:151
void setReferenceFrame(const Frame *const refFrame)
Definition: frame.cpp:665
Vec localCoordinatesOf(const Vec &src) const
Definition: frame.cpp:731
qreal z
Definition: vec.h:81
void setRotation(const Quaternion &rotation)
Definition: frame.h:215
qreal y
Definition: vec.h:81
void rotate(Quaternion &q)
Definition: frame.cpp:376
The Vec class represents 3D positions and 3D vectors.
Definition: vec.h:65
const GLdouble * matrix() const
Definition: frame.cpp:123
const GLdouble * worldMatrix() const
Definition: frame.cpp:196
void getPosition(qreal &x, qreal &y, qreal &z) const
Definition: frame.cpp:492
bool settingAsReferenceFrameWillCreateALoop(const Frame *const frame)
Definition: frame.cpp:680
void setTranslation(const Vec &translation)
Definition: frame.h:201
Vec localTransformOf(const Vec &src) const
Definition: frame.cpp:872
void projectOnLine(const Vec &origin, const Vec &direction)
Definition: frame.cpp:1133
Quaternion normalized() const
Definition: quaternion.h:238
Quaternion rotation() const
Definition: frame.h:237
void getTranslation(qreal &x, qreal &y, qreal &z) const
Definition: frame.cpp:291
Quaternion q_
Definition: frame.h:404
void getCoordinatesOfFrom(const qreal src[3], qreal res[3], const Frame *const from) const
Definition: frame.cpp:825
void setFromMatrix(const GLdouble m[4][4])
Definition: frame.cpp:228
void getInverseCoordinatesOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:793
Vec transformOfFrom(const Vec &src, const Frame *const from) const
Definition: frame.cpp:890
void setTranslationAndRotation(const Vec &translation, const Quaternion &rotation)
Definition: frame.cpp:483
Vec coordinatesOf(const Vec &src) const
Definition: frame.cpp:702
void translate(Vec &t)
Definition: frame.cpp:335
The Quaternion class represents 3D rotations and orientations.
Definition: quaternion.h:66
Quaternion orientation() const
Definition: frame.cpp:546
void setOrientationWithConstraint(Quaternion &orientation)
Definition: frame.cpp:631
Vec coordinatesOfFrom(const Vec &src, const Frame *const from) const
Definition: frame.cpp:749
void setTranslationAndRotationWithConstraint(Vec &translation, Quaternion &rotation)
Definition: frame.cpp:595
Constraint * constraint() const
Definition: frame.h:356
void setPosition(const Vec &position)
Definition: frame.cpp:443
void projectOnAxis(const Vec &direction)
Definition: vec.cpp:34
const Frame * referenceFrame_
Definition: frame.h:410
void alignWithFrame(const Frame *const frame, bool move=false, qreal threshold=0.0)
Definition: frame.cpp:1055
void getOrientation(qreal &q0, qreal &q1, qreal &q2, qreal &q3) const
Definition: frame.cpp:526
The Frame class represents a coordinate system, defined by a position and an orientation.
Definition: frame.h:121
void getMatrix(GLdouble m[4][4]) const
Definition: quaternion.cpp:317
Frame & operator=(const Frame &frame)
Definition: frame.cpp:54
void setOrientation(const Quaternion &orientation)
Definition: frame.cpp:505
virtual void constrainRotation(Quaternion &rotation, Frame *const frame)
Definition: constraint.h:142
const Frame * referenceFrame() const
Definition: frame.h:262
Vec translation() const
Definition: frame.h:228
Vec localInverseTransformOf(const Vec &src) const
Definition: frame.cpp:881
Vec inverseCoordinatesOf(const Vec &src) const
Definition: frame.cpp:715
Frame inverse() const
Definition: frame.cpp:164
void setPositionAndOrientation(const Vec &position, const Quaternion &orientation)
Definition: frame.cpp:462
Vec coordinatesOfIn(const Vec &src, const Frame *const in) const
Definition: frame.cpp:764
void setPositionAndOrientationWithConstraint(Vec &position, Quaternion &orientation)
Definition: frame.cpp:641
qreal x
Definition: vec.h:81
virtual void initFromDOMElement(const QDomElement &element)
Definition: frame.cpp:1011
void getRotation(qreal &q0, qreal &q1, qreal &q2, qreal &q3) const
Definition: frame.cpp:308
void getLocalTransformOf(const qreal src[3], qreal res[3]) const
Definition: frame.cpp:942
void rotateAroundPoint(Quaternion &rotation, const Vec &point)
Definition: frame.cpp:414


octovis
Author(s): Kai M. Wurm , Armin Hornung
autogenerated on Wed Jun 5 2019 19:26:39