Skip to content

Commit ffcb20c

Browse files
authored
Use the starting orientation transform value throughout journey (CelestiaProject#2352)
This does not affect Celestia frontends here since the transform is always .identity. The initial/final orientation of journeys should be the same, because in VR, user might look away and the orientation transform changes.
1 parent feadec9 commit ffcb20c

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

src/celengine/observer.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -578,14 +578,14 @@ Observer::setOriginalOrientation(const Eigen::Quaterniond& q)
578578
updateOrientation();
579579
}
580580

581-
Eigen::Matrix3d
581+
const Eigen::Quaterniond&
582582
Observer::getOrientationTransform() const
583583
{
584584
return orientationTransform;
585585
}
586586

587587
void
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)
720720
void
721721
Observer::updateOrientation()
722722
{
723-
transformedOrientationUniv = Eigen::Quaterniond(orientationTransform) * originalOrientationUniv;
723+
transformedOrientationUniv = orientationTransform * originalOrientationUniv;
724724
transformedOrientation = frame->convertFromUniversal(transformedOrientationUniv, getTime());
725725
}
726726

727727
Eigen::Quaterniond
728728
Observer::undoTransform(const Eigen::Quaterniond& transformed) const
729729
{
730-
return Eigen::Quaterniond(orientationTransform).inverse() * transformed;
730+
return orientationTransform.inverse() * transformed;
731731
}
732732

733733
Selection
@@ -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

13241331
void
@@ -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

13471354
void
@@ -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

14101417
void
@@ -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

14351442
void
@@ -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

15001507
void

src/celengine/observer.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,9 @@ class Observer
133133
void setOrientation(const Eigen::Quaternionf&);
134134
void setOrientation(const Eigen::Quaterniond&);
135135

136-
Eigen::Matrix3d getOrientationTransform() const;
137-
void setOrientationTransform(const Eigen::Matrix3d&);
138-
139-
void applyCurrentTransform();
136+
const Eigen::Quaterniond& getOrientationTransform() const;
137+
void setOrientationTransform(const Eigen::Quaterniond&);
138+
void applyCurrentTransform();
140139

141140
Eigen::Vector3d getVelocity() const;
142141
void setVelocity(const Eigen::Vector3d&);
@@ -259,14 +258,14 @@ class Observer
259258
double expFactor{ 0.5 };
260259
double accelTime{ AccelerationTime };
261260
Eigen::Quaterniond rotation1; // rotation on the CircularOrbit around centerObject
261+
Eigen::Quaterniond orientationTransformInverse; // the inverse of orientation transform when the journey starts
262262

263263
Selection centerObject;
264264

265265
TrajectoryType traj{ TrajectoryType::Linear };
266266
};
267267

268268
void gotoJourney(const JourneyParams&);
269-
// void setSimulation(Simulation* _sim) { sim = _sim; };
270269

271270
private:
272271
void computeGotoParameters(const Selection &sel,
@@ -289,6 +288,8 @@ class Observer
289288
JourneyParams &jparams,
290289
double centerTime) const;
291290

291+
void startTraveling();
292+
292293
void setOriginalOrientation(const Eigen::Quaternionf&);
293294
void setOriginalOrientation(const Eigen::Quaterniond&);
294295
void updateUniversal();
@@ -302,7 +303,7 @@ class Observer
302303
UniversalCoord position{ 0.0, 0.0, 0.0 };
303304
Eigen::Quaterniond originalOrientation{ Eigen::Quaterniond::Identity() };
304305
Eigen::Quaterniond transformedOrientation{ Eigen::Quaterniond::Identity() };
305-
Eigen::Matrix3d orientationTransform{ Eigen::Matrix3d::Identity() };
306+
Eigen::Quaterniond orientationTransform{ Eigen::Quaterniond::Identity() };
306307
Eigen::Vector3d velocity{ Eigen::Vector3d::Zero() };
307308
Eigen::Vector3d angularVelocity{ Eigen::Vector3d::Zero() };
308309

0 commit comments

Comments
 (0)