X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fviewer.cxx;h=f2ffd56c9d57a5fae327aae613bc7e6fc6068f45;hb=18d1593c42c2df60d7fb44ace722ca3e8a7fd82c;hp=c29b99dbe74a7f14667d269b7f323dbacd96ce75;hpb=7e5d6d1d75e56f3537acbf28230dd307da965d96;p=flightgear.git diff --git a/src/Main/viewer.cxx b/src/Main/viewer.cxx index c29b99dbe..f2ffd56c9 100644 --- a/src/Main/viewer.cxx +++ b/src/Main/viewer.cxx @@ -37,7 +37,6 @@ #include #include -#include #include #include #include @@ -50,6 +49,9 @@ #include "viewer.hxx" +#include "CameraGroup.hxx" + +using namespace flightgear; //////////////////////////////////////////////////////////////////////// // Implementation of FGViewer. @@ -81,7 +83,8 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index, _damp_heading(0), _scaling_type(FG_SCALING_MAX), _location(0), - _target_location(0) + _target_location(0), + _cameraGroup(CameraGroup::getDefault()) { _absolute_view_pos = SGVec3d(0, 0, 0); _type = Type; @@ -402,14 +405,6 @@ FGViewer::setOrientationOffsets (double roll_offset_deg, double pitch_offset_deg _heading_offset_deg = heading_offset_deg; } -double * -FGViewer::get_absolute_view_pos () -{ - if (_dirty) - recalc(); - return _absolute_view_pos.data(); -} - // recalc() is done every time one of the setters is called (making the // cached data "dirty") on the next "get". It calculates all the outputs // for viewer. @@ -422,12 +417,9 @@ FGViewer::recalc () recalcLookAt(); } - SGVec3d center = globals->get_scenery()->get_center(); - _view_pos = toVec3f(_absolute_view_pos - center); - SGGeod geodEyePoint = SGGeod::fromCart(_absolute_view_pos); geodEyePoint.setElevationM(0); - _zero_elev = toVec3f(SGVec3d::fromGeod(geodEyePoint) - center); + _zero_elev = SGVec3d::fromGeod(geodEyePoint); SGQuatd hlOr = SGQuatd::fromLonLat(geodEyePoint); _surface_south = toVec3f(hlOr.backTransform(-SGVec3d::e1())); @@ -479,25 +471,24 @@ FGViewer::recalcLookFrom () // 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 frame - SGQuatd hlOr = SGQuatd::fromLonLat(geodPos); + // the horizontal local OpenGL frame + SGQuatd hlOr = SGQuatd::viewHL(geodPos); + // 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); // the rotation offset, don't know why heading is negative here ... - SGQuatd viewOffsetOr = + SGQuatd viewOffsetOr = SGQuatd::simToView( SGQuatd::fromYawPitchRollDeg(-_heading_offset_deg, _pitch_offset_deg, - _roll_offset_deg); - - // The offset vector is meant: x +right/-left, y +up/-down, z, +back/-fwd - // We work in the body coordinate system which is slightly different - SGVec3d off(-_offset_m.z(), _offset_m.x(), -_offset_m.y()); + _roll_offset_deg)); // Compute the eyepoints orientation and position // wrt the earth centered frame - that is global coorinates SGQuatd ec2body = hlOr*hlToBody; - _absolute_view_pos = position + ec2body.backTransform(off); + _absolute_view_pos = position + ec2body.backTransform(_offset_m); mViewOrientation = ec2body*viewOffsetOr; } @@ -562,7 +553,7 @@ FGViewer::recalcLookAt () _roll_offset_deg); // Offsets to the eye position - SGVec3d eyeOff(-_offset_m.z(), _offset_m.y(), -_offset_m.x()); + SGVec3d eyeOff(-_offset_m.z(), _offset_m.x(), -_offset_m.y()); SGQuatd ec2eye = geodEyeHlOr*geodEyeOr; SGVec3d eyeCart = SGVec3d::fromGeod(geodEyePos); eyeCart += (ec2eye*eyeOffsetOr).backTransform(eyeOff); @@ -583,14 +574,14 @@ FGViewer::recalcLookAt () // the view direction SGVec3d dir = normalize(atCart - eyeCart); // the up directon - SGVec3d up = ec2eye.backTransform(SGVec3d(0, 0, 1)); + SGVec3d up = ec2eye.backTransform(SGVec3d(0, 0, -1)); // rotate dir to the 0-th unit vector // rotate up to 2-th unit vector - mViewOrientation = SGQuatd::fromRotateTo(dir, 0, up, 2); + mViewOrientation = SGQuatd::fromRotateTo(-dir, 2, up, 1); } void -FGViewer::dampEyeData (double &roll_deg, double &pitch_deg, double &heading_deg) +FGViewer::dampEyeData(double &roll_deg, double &pitch_deg, double &heading_deg) { const double interval = 0.01; @@ -776,5 +767,7 @@ FGViewer::update (double dt) } } } - + recalc(); + _cameraGroup->update(_absolute_view_pos.osg(), mViewOrientation.osg()); + _cameraGroup->setCameraParameters(get_v_fov(), get_aspect_ratio()); }