#include "fg_props.hxx"
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#include <simgear/debug/logstream.hxx>
#include <simgear/constants.h>
#include <simgear/scene/model/placement.hxx>
double target_x_offset_m, double target_y_offset_m,
double target_z_offset_m, double near_m, bool internal ):
_dirty(true),
- _lon_deg(0),
- _lat_deg(0),
- _alt_ft(0),
- _target_lon_deg(0),
- _target_lat_deg(0),
- _target_alt_ft(0),
_roll_deg(0),
_pitch_deg(0),
_heading_deg(0),
_internal = internal;
}
-void
-FGViewer::setLongitude_deg (double lon_deg)
-{
- _dirty = true;
- _lon_deg = lon_deg;
-}
-
-void
-FGViewer::setLatitude_deg (double lat_deg)
-{
- _dirty = true;
- _lat_deg = lat_deg;
-}
-
-void
-FGViewer::setAltitude_ft (double alt_ft)
-{
- _dirty = true;
- _alt_ft = alt_ft;
-}
-
void
FGViewer::setPosition (double lon_deg, double lat_deg, double alt_ft)
{
_dirty = true;
- _lon_deg = lon_deg;
- _lat_deg = lat_deg;
- _alt_ft = alt_ft;
-}
-
-void
-FGViewer::setTargetLongitude_deg (double lon_deg)
-{
- _dirty = true;
- _target_lon_deg = lon_deg;
-}
-
-void
-FGViewer::setTargetLatitude_deg (double lat_deg)
-{
- _dirty = true;
- _target_lat_deg = lat_deg;
-}
-
-void
-FGViewer::setTargetAltitude_ft (double alt_ft)
-{
- _dirty = true;
- _target_alt_ft = alt_ft;
+ _position = SGGeod::fromDegFt(lon_deg, lat_deg, alt_ft);
}
void
FGViewer::setTargetPosition (double lon_deg, double lat_deg, double alt_ft)
{
_dirty = true;
- _target_lon_deg = lon_deg;
- _target_lat_deg = lat_deg;
- _target_alt_ft = alt_ft;
+ _target = SGGeod::fromDegFt(lon_deg, lat_deg, alt_ft);
}
void
// Update location data ...
if ( _from_model ) {
SGModelPlacement* placement = globals->get_aircraft_model()->get3DModel();
- _lat_deg = placement->getLatitudeDeg();
- _lon_deg = placement->getLongitudeDeg();
- _alt_ft = placement->getElevationFt();
-
+ _position = placement->getPosition();
+
_heading_deg = placement->getHeadingDeg();
_pitch_deg = placement->getPitchDeg();
_roll_deg = placement->getRollDeg();
}
- double lat = _lat_deg;
- double lon = _lon_deg;
- double alt = _alt_ft;
+
double head = _heading_deg;
double pitch = _pitch_deg;
double roll = _roll_deg;
dampEyeData(roll, pitch, head);
}
- // The geodetic position of our base view position
- SGGeod geodPos = SGGeod::fromDegFt(lon, lat, alt);
// The rotation rotating from the earth centerd frame to
// the horizontal local OpenGL frame
- SGQuatd hlOr = SGQuatd::viewHL(geodPos);
+ SGQuatd hlOr = SGQuatd::viewHL(_position);
// the rotation from the horizontal local frame to the basic view orientation
SGQuatd hlToBody = SGQuatd::fromYawPitchRollDeg(head, pitch, roll);
hlToBody = SGQuatd::simToView(hlToBody);
// The cartesian position of the basic view coordinate
- SGVec3d position = SGVec3d::fromGeod(geodPos);
+ SGVec3d position = SGVec3d::fromGeod(_position);
// the rotation offset, don't know why heading is negative here ...
SGQuatd viewOffsetOr = SGQuatd::simToView(
SGQuatd::fromYawPitchRollDeg(-_heading_offset_deg, _pitch_offset_deg,
// The geodetic position of our target to look at
if ( _at_model ) {
SGModelPlacement* placement = globals->get_aircraft_model()->get3DModel();
- _target_lat_deg = placement->getLatitudeDeg();
- _target_lon_deg = placement->getLongitudeDeg();
- _target_alt_ft = placement->getElevationFt();
+ _target = placement->getPosition();
_target_heading_deg = placement->getHeadingDeg();
_target_pitch_deg = placement->getPitchDeg();
_target_roll_deg = placement->getRollDeg();
dampEyeData(_target_roll_deg, _target_pitch_deg, _target_heading_deg);
}
- SGGeod geodTargetPos = SGGeod::fromDegFt(_target_lon_deg,
- _target_lat_deg,
- _target_alt_ft);
+
SGQuatd geodTargetOr = SGQuatd::fromYawPitchRollDeg(_target_heading_deg,
_target_pitch_deg,
_target_roll_deg);
- SGQuatd geodTargetHlOr = SGQuatd::fromLonLat(geodTargetPos);
+ SGQuatd geodTargetHlOr = SGQuatd::fromLonLat(_target);
if ( _from_model ) {
SGModelPlacement* placement = globals->get_aircraft_model()->get3DModel();
- _lat_deg = placement->getLatitudeDeg();
- _lon_deg = placement->getLongitudeDeg();
- _alt_ft = placement->getElevationFt();
+ _position = placement->getPosition();
_heading_deg = placement->getHeadingDeg();
_pitch_deg = placement->getPitchDeg();
_roll_deg = placement->getRollDeg();
// update from our own data, just the rotation here...
dampEyeData(_roll_deg, _pitch_deg, _heading_deg);
}
- SGGeod geodEyePos = SGGeod::fromDegFt(_lon_deg, _lat_deg, _alt_ft);
SGQuatd geodEyeOr = SGQuatd::fromYawPitchRollDeg(_heading_deg,
_pitch_deg,
_roll_deg);
- SGQuatd geodEyeHlOr = SGQuatd::fromLonLat(geodEyePos);
+ SGQuatd geodEyeHlOr = SGQuatd::fromLonLat(_position);
// the rotation offset, don't know why heading is negative here ...
SGQuatd eyeOffsetOr =
// Offsets to the eye position
SGVec3d eyeOff(-_offset_m.z(), _offset_m.x(), -_offset_m.y());
SGQuatd ec2eye = geodEyeHlOr*geodEyeOr;
- SGVec3d eyeCart = SGVec3d::fromGeod(geodEyePos);
+ SGVec3d eyeCart = SGVec3d::fromGeod(_position);
eyeCart += (ec2eye*eyeOffsetOr).backTransform(eyeOff);
- SGVec3d atCart = SGVec3d::fromGeod(geodTargetPos);
+ SGVec3d atCart = SGVec3d::fromGeod(_target);
// add target offsets to at_position...
SGVec3d target_pos_off(-_target_offset_m.z(), _target_offset_m.x(),
// pilot view, model in model view).
// FIXME: the model view position (ie target positions)
// should be in the model class.
- virtual double getLongitude_deg () const { return _lon_deg; }
- virtual double getLatitude_deg () const { return _lat_deg; }
- virtual double getAltitudeASL_ft () const { return _alt_ft; }
- virtual void setLongitude_deg (double lon_deg);
- virtual void setLatitude_deg (double lat_deg);
- virtual void setAltitude_ft (double alt_ft);
+ virtual double getLongitude_deg () const { return _position.getLongitudeDeg(); }
+ virtual double getLatitude_deg () const { return _position.getLatitudeDeg(); }
+
virtual void setPosition (double lon_deg, double lat_deg, double alt_ft);
+ const SGGeod& getPosition() const { return _position; }
+
// Reference geodetic target position...
- virtual double getTargetLongitude_deg () const { return _target_lon_deg; }
- virtual double getTargetLatitude_deg () const { return _target_lat_deg; }
- virtual double getTargetAltitudeASL_ft () const { return _target_alt_ft; }
- virtual void setTargetLongitude_deg (double lon_deg);
- virtual void setTargetLatitude_deg (double lat_deg);
- virtual void setTargetAltitude_ft (double alt_ft);
virtual void setTargetPosition (double lon_deg, double lat_deg, double alt_ft);
-
+ const SGGeod& getTargetPosition() const { return _target; }
SGQuatd mViewOrientation;
SGVec3d _absolute_view_pos;
- double _lon_deg;
- double _lat_deg;
- double _alt_ft;
- double _target_lon_deg;
- double _target_lat_deg;
- double _target_alt_ft;
+ SGGeod _position;
+ SGGeod _target;
double _roll_deg;
double _pitch_deg;