view_offset = 0.0;
goal_view_offset = 0.0;
+ sgSetVec3( pilot_offset, 0.0, 0.0, 0.0 );
winWidth = current_options.get_xsize();
winHeight = current_options.get_ysize();
sgSetVec3( vec1, 1.0, 0.0, 0.0 );
sgXformVec3( view_up, vec1, VIEWo );
+ // generate the pilot offset vector in world coordinates
+ sgVec3 pilot_offset_world;
+ sgSetVec3( vec1,
+ pilot_offset[2], pilot_offset[1], -pilot_offset[0] );
+ sgXformVec3( pilot_offset_world, vec1, VIEWo );
+
// generate the view offset matrix
sgMakeRotMat4( VIEW_OFFSET, view_offset * RAD_TO_DEG, view_up );
// cout << "VIEW_OFFSET matrix" << endl;
// cout << "VIEW_ROT matrix" << endl;
// print_sgMat4( VIEW_ROT );
- sgMakeTransMat4( TRANS, view_pos.x(), view_pos.y(), view_pos.z() );
+ sgMakeTransMat4( TRANS,
+ view_pos.x() + pilot_offset_world[0],
+ view_pos.y() + pilot_offset_world[1],
+ view_pos.z() + pilot_offset_world[2] );
sgMultMat4( VIEW, VIEW_ROT, TRANS );
// view position translated to scenery.center
Point3D view_pos;
+ // pilot offset from center of gravity. The X axis is positive
+ // out the tail, Y is out the right wing, and Z is positive up.
+ // Distances in meters of course.
+ sgVec3 pilot_offset;
+
// cartesion coordinates of current lon/lat if at sea level
// translated to scenery.center
Point3D cur_zero_elev;
inline void set_tris_culled( int tris) { tris_culled = tris; }
inline Point3D get_abs_view_pos() const { return abs_view_pos; }
inline Point3D get_view_pos() const { return view_pos; }
+ inline float *get_pilot_offset() { return pilot_offset; }
+ inline void set_pilot_offset( float x, float y, float z ) {
+ sgSetVec3( pilot_offset, x, y, z );
+ }
inline Point3D get_cur_zero_elev() const { return cur_zero_elev; }
inline float *get_to_sun() { return to_sun; }
- inline void set_to_sun( float x, float y, float z) {
+ inline void set_to_sun( float x, float y, float z ) {
sgSetVec3( to_sun, x, y, z );
}
inline float *get_surface_to_sun() { return surface_to_sun; }