00001 /***************************************************************************** 00002 * SGL: A Scene Graph Library 00003 * 00004 * Copyright (C) 1997-2001 Scott McMillan All Rights Reserved. 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Library General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Library General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Library General Public 00017 * License along with this library; if not, write to the Free 00018 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 ***************************************************************************** 00020 * File: sgluFlyCamera.hpp 00021 * Created: 21 March 1997 00022 * Summary: free-fly camera subclass def - was dmGLFLyCamera.hpp 00023 *****************************************************************************/ 00024 00025 #ifndef __SGLU_FLY_CAMERA_HPP 00026 #define __SGLU_FLY_CAMERA_HPP 00027 00028 #include <sglu.h> 00029 #include <sgluCamera.hpp> 00030 #include <sgluMouse.hpp> 00031 00032 class SGLU_DLL_API sgluFlyCamera : public sgluCamera 00033 { 00034 public: 00035 sgluFlyCamera(); 00036 virtual ~sgluFlyCamera(); 00037 00038 void reset(); 00039 void setTranslationScale(float scale) {m_trans_scale = scale;} 00040 00041 // Lower level functions to affect camera state changes 00042 void updateAzimuth(float delta_azimuth); 00043 void updateElevation(float delta_elevation); 00044 void updateFlyPos(float delta_pos_ff[3]); 00045 void updateFlyPos(float delta_x, float delta_y, float delta_z); 00046 00047 void setAzimuth(float azimuth); 00048 void setElevation(float elevation); 00049 void setFlyPos(float pos_ff[3]); 00050 void setFlyPos(float x, float y, float z); 00051 00052 // the update() function sets the current m_view_mat that defines the 00053 // camera's position with respect to the GAPI's base coordinate system. 00054 // 00055 // update(mouse *) changes the camera position and orientation 00056 // according to the mouse position relative to the screen and 00057 // which mouse buttons are being pressed, and computes the new 00058 // matrix from these values: 00059 // - the camera position can be moved right/left and up/down with 00060 // the middle mouse button and the distance 00061 // from the center of the window using 00062 // - the position is modified forward/backward using the right 00063 // mouse button and the vertical distance from the center of 00064 // the window 00065 // - the heading and pitch can be modified using the left mouse 00066 // button and the horizontal and vertical distances from the 00067 // center of the window respectively. 00068 // 00069 // NOTE that in either case applyView() from HtPfCamera must be called to 00070 // push the changes to the channel view matrix. 00071 void update(sgluMouse *mouse); 00072 00073 void applyView(); 00074 00075 SGLU_DLL_API friend ostream& operator<<( 00076 ostream &ostrm, const sgluFlyCamera &cam); 00077 00078 private: // not implemented 00079 sgluFlyCamera(const sgluFlyCamera&); 00080 sgluFlyCamera &operator=(const sgluFlyCamera&); 00081 00082 private: 00083 float m_pos_ff[3]; // current camera position 00084 float m_look_at[3], m_up[3]; 00085 float m_elevation, m_sin_el, m_cos_el; // elevation angle in degrees 00086 float m_azimuth, m_sin_az, m_cos_az; // azimuth angle in degrees 00087 00088 float m_trans_scale; 00089 }; 00090 00091 #endif