1
0
Fork 0

Merge branch 'jmt/view'

This commit is contained in:
Tim Moore 2010-05-06 11:03:18 +02:00
commit 28ec7db69d
2 changed files with 68 additions and 77 deletions

View file

@ -64,10 +64,6 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index,
_roll_deg(0), _roll_deg(0),
_pitch_deg(0), _pitch_deg(0),
_heading_deg(0), _heading_deg(0),
_damp_sync(0),
_damp_roll(0),
_damp_pitch(0),
_damp_heading(0),
_scaling_type(FG_SCALING_MAX), _scaling_type(FG_SCALING_MAX),
_aspect_ratio(0), _aspect_ratio(0),
_cameraGroup(CameraGroup::getDefault()) _cameraGroup(CameraGroup::getDefault())
@ -81,12 +77,16 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index,
_internal = internal; _internal = internal;
_dampFactor = SGVec3d::zeros();
_dampOutput = SGVec3d::zeros();
_dampTarget = SGVec3d::zeros();
if (damp_roll > 0.0) if (damp_roll > 0.0)
_damp_roll = 1.0 / pow(10.0, fabs(damp_roll)); _dampFactor[0] = 1.0 / pow(10.0, fabs(damp_roll));
if (damp_pitch > 0.0) if (damp_pitch > 0.0)
_damp_pitch = 1.0 / pow(10.0, fabs(damp_pitch)); _dampFactor[1] = 1.0 / pow(10.0, fabs(damp_pitch));
if (damp_heading > 0.0) if (damp_heading > 0.0)
_damp_heading = 1.0 / pow(10.0, fabs(damp_heading)); _dampFactor[2] = 1.0 / pow(10.0, fabs(damp_heading));
_offset_m.x() = x_offset_m; _offset_m.x() = x_offset_m;
_offset_m.y() = y_offset_m; _offset_m.y() = y_offset_m;
@ -369,7 +369,8 @@ FGViewer::recalcLookFrom ()
double roll = _roll_deg; double roll = _roll_deg;
if ( !_from_model ) { if ( !_from_model ) {
// update from our own data... // update from our own data...
dampEyeData(roll, pitch, head); setDampTarget(roll, pitch, head);
getDampOutput(roll, pitch, head);
} }
// The rotation rotating from the earth centerd frame to // The rotation rotating from the earth centerd frame to
@ -411,13 +412,13 @@ FGViewer::recalcLookAt ()
_target_roll_deg = placement->getRollDeg(); _target_roll_deg = placement->getRollDeg();
} else { } else {
// if not model then calculate our own target position... // if not model then calculate our own target position...
dampEyeData(_target_roll_deg, _target_pitch_deg, _target_heading_deg); setDampTarget(_target_roll_deg, _target_pitch_deg, _target_heading_deg);
getDampOutput(_target_roll_deg, _target_pitch_deg, _target_heading_deg);
} }
SGQuatd geodTargetOr = SGQuatd::fromYawPitchRollDeg(_target_heading_deg, SGQuatd geodTargetOr = SGQuatd::fromYawPitchRollDeg(_target_heading_deg,
_target_pitch_deg, _target_pitch_deg,
_target_roll_deg); _target_roll_deg);
SGQuatd geodTargetHlOr = SGQuatd::fromLonLat(_target); SGQuatd geodTargetHlOr = SGQuatd::fromLonLat(_target);
@ -429,11 +430,10 @@ FGViewer::recalcLookAt ()
_roll_deg = placement->getRollDeg(); _roll_deg = placement->getRollDeg();
} else { } else {
// update from our own data, just the rotation here... // update from our own data, just the rotation here...
dampEyeData(_roll_deg, _pitch_deg, _heading_deg); setDampTarget(_roll_deg, _pitch_deg, _heading_deg);
getDampOutput(_roll_deg, _pitch_deg, _heading_deg);
} }
SGQuatd geodEyeOr = SGQuatd::fromYawPitchRollDeg(_heading_deg, SGQuatd geodEyeOr = SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
_pitch_deg,
_roll_deg);
SGQuatd geodEyeHlOr = SGQuatd::fromLonLat(_position); SGQuatd geodEyeHlOr = SGQuatd::fromLonLat(_position);
// the rotation offset, don't know why heading is negative here ... // the rotation offset, don't know why heading is negative here ...
@ -472,61 +472,53 @@ FGViewer::recalcLookAt ()
} }
void void
FGViewer::dampEyeData(double &roll_deg, double &pitch_deg, double &heading_deg) FGViewer::setDampTarget(double roll, double pitch, double heading)
{ {
const double interval = 0.01; _dampTarget = SGVec3d(roll, pitch, heading);
}
void
FGViewer::getDampOutput(double& roll, double& pitch, double& heading)
{
roll = _dampOutput[0];
pitch = _dampOutput[1];
heading = _dampOutput[2];
}
void
FGViewer::updateDampOutput(double dt)
{
static FGViewer *last_view = 0; static FGViewer *last_view = 0;
if (last_view != this) { if ((last_view != this) || (dt > 1.0)) {
_damp_sync = 0.0; _dampOutput = _dampTarget;
_damped_roll_deg = roll_deg;
_damped_pitch_deg = pitch_deg;
_damped_heading_deg = heading_deg;
last_view = this; last_view = this;
return; return;
} }
if (_damp_sync < interval) { const double interval = 0.01;
if (_damp_roll > 0.0) while (dt > interval) {
roll_deg = _damped_roll_deg;
if (_damp_pitch > 0.0)
pitch_deg = _damped_pitch_deg;
if (_damp_heading > 0.0)
heading_deg = _damped_heading_deg;
return;
}
while (_damp_sync >= interval) { for (unsigned int i=0; i<3; ++i) {
_damp_sync -= interval; if (_dampFactor[i] <= 0.0) {
// axis is un-damped, set output to target directly
_dampOutput[i] = _dampTarget[i];
continue;
}
double d; double d = _dampOutput[i] - _dampTarget[i];
if (_damp_roll > 0.0) { if (d > 180.0) {
d = _damped_roll_deg - roll_deg; _dampOutput[i] -= 360.0;
if (d >= 180.0) } else if (d < -180.0) {
_damped_roll_deg -= 360.0; _dampOutput[i] += 360.0;
else if (d < -180.0) }
_damped_roll_deg += 360.0;
roll_deg = _damped_roll_deg = roll_deg * _damp_roll + _damped_roll_deg * (1 - _damp_roll);
}
if (_damp_pitch > 0.0) { _dampOutput[i] = (_dampTarget[i] * _dampFactor[i]) +
d = _damped_pitch_deg - pitch_deg; (_dampOutput[i] * (1.0 - _dampFactor[i]));
if (d >= 180.0) } // of axis iteration
_damped_pitch_deg -= 360.0;
else if (d < -180.0)
_damped_pitch_deg += 360.0;
pitch_deg = _damped_pitch_deg = pitch_deg * _damp_pitch + _damped_pitch_deg * (1 - _damp_pitch);
}
if (_damp_heading > 0.0) { dt -= interval;
d = _damped_heading_deg - heading_deg; } // of dt subdivision by interval
if (d >= 180.0)
_damped_heading_deg -= 360.0;
else if (d < -180.0)
_damped_heading_deg += 360.0;
heading_deg = _damped_heading_deg = heading_deg * _damp_heading + _damped_heading_deg * (1 - _damp_heading);
}
}
} }
double double
@ -583,7 +575,7 @@ FGViewer::get_v_fov()
void void
FGViewer::update (double dt) FGViewer::update (double dt)
{ {
_damp_sync += dt; updateDampOutput(dt);
int i; int i;
int dt_ms = int(dt * 1000); int dt_ms = int(dt * 1000);

View file

@ -262,14 +262,9 @@ private:
double _target_pitch_deg; double _target_pitch_deg;
double _target_heading_deg; double _target_heading_deg;
double _damp_sync; SGVec3d _dampTarget; ///< current target value we are damping towards
double _damp_roll; SGVec3d _dampOutput; ///< current output of damping filter
double _damp_pitch; SGVec3d _dampFactor; ///< weighting of the damping filter
double _damp_heading;
double _damped_roll_deg;
double _damped_pitch_deg;
double _damped_heading_deg;
// Position offsets from FDM origin. The X axis is positive // Position offsets from FDM origin. The X axis is positive
// out the tail, Y is out the right wing, and Z is positive up. // out the tail, Y is out the right wing, and Z is positive up.
@ -328,7 +323,11 @@ private:
void recalc (); void recalc ();
void recalcLookFrom(); void recalcLookFrom();
void recalcLookAt(); void recalcLookAt();
void dampEyeData(double &roll_deg, double &pitch_deg, double &heading_deg);
void setDampTarget(double h, double p, double r);
void getDampOutput(double& roll, double& pitch, double& heading);
void updateDampOutput(double dt);
// add to _heading_offset_deg // add to _heading_offset_deg
inline void incHeadingOffset_deg( double amt ) { inline void incHeadingOffset_deg( double amt ) {