- 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_hpr( cur_fdm_state->get_Psi(),
- cur_fdm_state->get_Theta(),
- cur_fdm_state->get_Phi() );
-
- // update view volume parameters
- // cout << "before pilot_view update" << endl;
- if ( globals->get_options()->get_view_mode() ==
- FGOptions::FG_VIEW_FOLLOW )
- {
- float * offset = globals->get_current_view()->get_pilot_offset();
- globals->get_current_view()->set_pilot_offset( offset[0],
- offset[1],
- offset[2] );
- } else {
- globals->get_current_view()->set_pilot_offset(0.0, 0.0, 0.0);
+ 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 );
+
+#if 0
+ sgMat4 rph;
+ sgCopyMat4( rph, pilot_view->get_VIEW() );
+ cout << "RPH Matrix = " << endl;
+ int i, j;
+ for ( i = 0; i < 4; i++ ) {
+ for ( j = 0; j < 4; j++ ) {
+ printf("%10.4f ", rph[i][j]);
+ }
+ cout << endl;