- globals->get_current_view()->
- set_geod_view_pos( cur_fdm_state->get_Longitude(),
- cur_fdm_state->get_Lat_geocentric(),
- cur_fdm_state->get_Altitude() *
- FEET_TO_METER );
- globals->get_current_view()->
- set_sea_level_radius( cur_fdm_state->get_Sea_level_radius() *
- FEET_TO_METER );
- globals->get_current_view()->
- set_rph( cur_fdm_state->get_Phi(),
- cur_fdm_state->get_Theta(),
- cur_fdm_state->get_Psi() );
+ FGViewerRPH *pilot_view =
+ (FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
+
+ pilot_view->set_geod_view_pos( cur_fdm_state->get_Longitude(),
+ cur_fdm_state->get_Lat_geocentric(),
+ cur_fdm_state->get_Altitude() *
+ SG_FEET_TO_METER );
+ pilot_view->set_sea_level_radius( cur_fdm_state->
+ get_Sea_level_radius() *
+ SG_FEET_TO_METER );
+ pilot_view->set_rph( cur_fdm_state->get_Phi(),
+ cur_fdm_state->get_Theta(),
+ cur_fdm_state->get_Psi() );
+
+ FGViewerLookAt *chase_view =
+ (FGViewerLookAt *)globals->get_viewmgr()->get_view( 1 );
+
+ sgVec3 po; // chase view pilot_offset
+ sgVec3 wup; // chase view world up
+ sgSetVec3( po, 0.0, 0.0, 100.0 );
+ sgCopyVec3( wup, pilot_view->get_world_up() );
+ sgMat4 CXFM; // chase view + pilot offset xform
+ sgMakeRotMat4( CXFM,
+ chase_view->get_view_offset() * SGD_RADIANS_TO_DEGREES -
+ cur_fdm_state->get_Psi() * SGD_RADIANS_TO_DEGREES,
+ wup );
+ sgVec3 npo; // new pilot offset after rotation
+ sgVec3 *pPO = PilotOffsetGet();
+ sgXformVec3( po, *pPO, pilot_view->get_UP() );
+ sgXformVec3( npo, po, CXFM );
+
+ chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(),
+ cur_fdm_state->get_Lat_geocentric(),
+ cur_fdm_state->get_Altitude() *
+ SG_FEET_TO_METER );
+ chase_view->set_sea_level_radius( cur_fdm_state->
+ get_Sea_level_radius() *
+ SG_FEET_TO_METER );
+ chase_view->set_pilot_offset( npo[0], npo[1], npo[2] );
+ chase_view->set_view_forward( pilot_view->get_view_pos() );
+ chase_view->set_view_up( wup );