@@ -578,14 +578,14 @@ Observer::setOriginalOrientation(const Eigen::Quaterniond& q)
578578 updateOrientation ();
579579}
580580
581- Eigen::Matrix3d
581+ const Eigen::Quaterniond&
582582Observer::getOrientationTransform () const
583583{
584584 return orientationTransform;
585585}
586586
587587void
588- Observer::setOrientationTransform (const Eigen::Matrix3d & transform)
588+ Observer::setOrientationTransform (const Eigen::Quaterniond & transform)
589589{
590590 orientationTransform = transform;
591591 updateOrientation ();
@@ -598,7 +598,7 @@ Observer::applyCurrentTransform()
598598{
599599 originalOrientationUniv = transformedOrientationUniv;
600600 originalOrientation = transformedOrientation;
601- orientationTransform = Eigen::Matrix3d ::Identity ();
601+ orientationTransform = Eigen::Quaterniond ::Identity ();
602602 updateOrientation ();
603603}
604604
@@ -663,7 +663,7 @@ Observer::update(double dt, double timeScale)
663663
664664 // Spherically interpolate the orientation over the first half
665665 // of the journey.
666- originalOrientation = undoTransform ( interpolateOrientation (journey, t) );
666+ originalOrientation = journey. orientationTransformInverse * interpolateOrientation (journey, t);
667667
668668 // If the journey's complete, reset to manual control
669669 if (t == 1 .0f )
@@ -672,7 +672,7 @@ Observer::update(double dt, double timeScale)
672672 {
673673 // situation = RigidTransform(journey.to, journey.finalOrientation);
674674 position = journey.to ;
675- originalOrientation = undoTransform ( journey.finalOrientation ) ;
675+ originalOrientation = journey.orientationTransformInverse * journey. finalOrientation ;
676676 }
677677
678678 observerMode = ObserverMode::Free;
@@ -720,14 +720,14 @@ Observer::update(double dt, double timeScale)
720720void
721721Observer::updateOrientation ()
722722{
723- transformedOrientationUniv = Eigen::Quaterniond ( orientationTransform) * originalOrientationUniv;
723+ transformedOrientationUniv = orientationTransform * originalOrientationUniv;
724724 transformedOrientation = frame->convertFromUniversal (transformedOrientationUniv, getTime ());
725725}
726726
727727Eigen::Quaterniond
728728Observer::undoTransform (const Eigen::Quaterniond& transformed) const
729729{
730- return Eigen::Quaterniond ( orientationTransform) .inverse () * transformed;
730+ return orientationTransform.inverse () * transformed;
731731}
732732
733733Selection
@@ -950,7 +950,7 @@ Observer::centerSelectionCO(const Selection& selection, double centerTime)
950950 if (!selection.empty () && !frame->getRefObject ().empty ())
951951 {
952952 computeCenterCOParameters (selection, journey, centerTime);
953- observerMode = ObserverMode::Travelling ;
953+ startTraveling () ;
954954 }
955955}
956956
@@ -1240,6 +1240,13 @@ Observer::gotoJourney(const JourneyParams& params)
12401240 0.0001 , 100.0 ,
12411241 1e-10 ).first ;
12421242 journey.startTime = realTime;
1243+ startTraveling ();
1244+ }
1245+
1246+ void
1247+ Observer::startTraveling ()
1248+ {
1249+ journey.orientationTransformInverse = orientationTransform.inverse ();
12431250 observerMode = ObserverMode::Travelling;
12441251}
12451252
@@ -1276,7 +1283,7 @@ Observer::gotoSelection(const Selection& selection,
12761283 ObserverFrame::CoordinateSystem::Universal,
12771284 up, upFrame);
12781285
1279- observerMode = ObserverMode::Travelling ;
1286+ startTraveling () ;
12801287}
12811288
12821289/* ! Like normal goto, except we'll follow a great circle trajectory. Useful
@@ -1318,7 +1325,7 @@ Observer::gotoSelectionGC(const Selection& selection,
13181325 up, upFrame,
13191326 centerObj);
13201327
1321- observerMode = ObserverMode::Travelling ;
1328+ startTraveling () ;
13221329}
13231330
13241331void
@@ -1341,7 +1348,7 @@ Observer::gotoSelection(const Selection& selection,
13411348 computeGotoParameters (selection, journey,
13421349 v * -distance, ObserverFrame::CoordinateSystem::Universal,
13431350 up, upFrame);
1344- observerMode = ObserverMode::Travelling ;
1351+ startTraveling () ;
13451352}
13461353
13471354void
@@ -1368,7 +1375,7 @@ Observer::gotoSelectionGC(const Selection& selection,
13681375 up, upFrame,
13691376 centerObj);
13701377
1371- observerMode = ObserverMode::Travelling ;
1378+ startTraveling () ;
13721379}
13731380
13741381/* * Make the observer travel to the specified planetocentric coordinates.
@@ -1404,7 +1411,7 @@ Observer::gotoSelectionLongLat(const Selection& selection,
14041411 ObserverFrame::CoordinateSystem::BodyFixed,
14051412 up, ObserverFrame::CoordinateSystem::BodyFixed);
14061413
1407- observerMode = ObserverMode::Travelling ;
1414+ startTraveling () ;
14081415}
14091416
14101417void
@@ -1429,7 +1436,7 @@ Observer::gotoLocation(const UniversalCoord& toPosition,
14291436 0.0001 , 100.0 ,
14301437 1e-10 ).first ;
14311438
1432- observerMode = ObserverMode::Travelling ;
1439+ startTraveling () ;
14331440}
14341441
14351442void
@@ -1494,7 +1501,7 @@ Observer::centerSelection(const Selection& selection, double centerTime)
14941501 return ;
14951502
14961503 computeCenterParameters (selection, journey, centerTime);
1497- observerMode = ObserverMode::Travelling ;
1504+ startTraveling () ;
14981505}
14991506
15001507void
0 commit comments