Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

OSGFlyNavigator.cpp

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *             Copyright (C) 2000,2001 by the OpenSG Forum                   *
00006  *                                                                           *
00007  *                            www.opensg.org                                 *
00008  *                                                                           *
00009  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00010  *                                                                           *
00011 \*---------------------------------------------------------------------------*/
00012 /*---------------------------------------------------------------------------*\
00013  *                                License                                    *
00014  *                                                                           *
00015  * This library is free software; you can redistribute it and/or modify it   *
00016  * under the terms of the GNU Library General Public License as published    *
00017  * by the Free Software Foundation, version 2.                               *
00018  *                                                                           *
00019  * This library is distributed in the hope that it will be useful, but       *
00020  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00022  * Library General Public License for more details.                          *
00023  *                                                                           *
00024  * You should have received a copy of the GNU Library General Public         *
00025  * License along with this library; if not, write to the Free Software       *
00026  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00027  *                                                                           *
00028 \*---------------------------------------------------------------------------*/
00029 /*---------------------------------------------------------------------------*\
00030  *                                Changes                                    *
00031  *                                                                           *
00032  *                                                                           *
00033  *                                                                           *
00034  *                                                                           *
00035  *                                                                           *
00036  *                                                                           *
00037 \*---------------------------------------------------------------------------*/
00038 
00039 #include <OSGConfig.h>
00040 #include <OSGBaseTypes.h>
00041 #include <OSGMatrix.h>
00042 #include <OSGMatrixUtility.h>
00043 
00044 #include "OSGFlyNavigator.h"
00045 
00046 OSG_USING_NAMESPACE
00047 
00048 /***************************************************************************\
00049  *                            Description                                  *
00050 \***************************************************************************/
00051 
00081 /*------------------------- constructors ----------------------------------*/
00082 
00083 FlyNavigator::FlyNavigator()
00084 {
00085     _rFrom  .setValues(0,0,0);
00086     _rAt    .setValues(0,0,1);
00087     _vUp    .setValues(0,1,0);
00088     _tMatrix.setIdentity();
00089 }
00090 
00091 
00092 /*-------------------------- destructors ----------------------------------*/
00093 
00094 FlyNavigator::~FlyNavigator()
00095 {
00096 }
00097 
00098 /*------------------------------ get --------------------------------------*/
00099 
00102 Matrix &FlyNavigator::getMatrix()
00103 {
00104     MatrixLookAt(_tMatrix,_rFrom,_rAt,_vUp);
00105     return _tMatrix;
00106 }
00107 
00110 Pnt3f &FlyNavigator::getFrom()
00111 {
00112     return _rFrom;
00113 }
00114 
00117 Pnt3f &FlyNavigator::getAt()
00118 {
00119     return _rAt;
00120 }
00121 
00124 Vec3f &FlyNavigator::getUp()
00125 {
00126     return _vUp;
00127 }
00128 
00129 
00130 /*------------------------------ set --------------------------------------*/
00131 
00135 void FlyNavigator::setFrom(Pnt3f new_from)
00136 {
00137     _rFrom=new_from;
00138 }
00139 
00142 void FlyNavigator::setAt(Pnt3f new_At)
00143 {
00144     _rAt=new_At;
00145 }
00146 
00149 void FlyNavigator::setUp(Vec3f new_up)
00150 {
00151     _vUp=new_up;
00152 }
00153 
00156 void FlyNavigator::set(Pnt3f new_from,Pnt3f new_At,Vec3f new_up)
00157 {
00158     _rFrom=new_from;
00159     _rAt=new_At;
00160     _vUp=new_up;
00161 }
00162 
00165 void FlyNavigator::set(Matrix new_matrix)
00166 {
00167     _rFrom= (Pnt3f) new_matrix[3];
00168     _rAt  = (Pnt3f)(new_matrix[3] - new_matrix[2]);
00169     _vUp  = (Vec3f) new_matrix[1];
00170     set(_rFrom, _rAt, _vUp);
00171 }
00172 
00173 /*---------------------- Flyer Transformations ----------------------------*/
00174 
00178 void FlyNavigator::rotate(Real32 deltaX, Real32 deltaY)
00179 {
00180     // rotate around the up vector
00181     Matrix final,temp;
00182     Quaternion q;
00183 
00184     q.setValueAsAxisRad(_vUp,-deltaX);
00185     q.getValue(temp);
00186 
00187     final.setIdentity();
00188     final.setTranslate(_rFrom);
00189     final.mult(temp);
00190 
00191     temp.setIdentity();
00192     temp.setTranslate(-_rFrom[0],-_rFrom[1],-_rFrom[2]);
00193 
00194     final.mult(temp);
00195     final.multMatrixPnt(_rAt);
00196 
00197     // rotate around the side vector
00198     Vec3f lv = _rAt-_rFrom;
00199     lv.normalize();
00200 
00201     Vec3f sv = lv;
00202     sv.crossThis(_vUp);
00203     sv.normalize();
00204     q.setValueAsAxisRad(sv,-deltaY);
00205     q.getValue(temp);
00206 
00207     final.setIdentity();
00208     final.setTranslate(_rFrom);
00209     final.mult(temp);
00210 
00211     temp.setIdentity();
00212     temp.setTranslate(-_rFrom[0],-_rFrom[1],-_rFrom[2]);
00213 
00214     final.mult(temp);
00215     final.multMatrixPnt(_rAt);
00216 }
00217 
00220 Real32 FlyNavigator::forward(Real32 step)
00221 {
00222     Vec3f lv;
00223     lv = _rFrom-_rAt;
00224     lv.normalize();
00225     lv *= (step);
00226     Matrix transl;
00227     transl.setIdentity();
00228     transl.setTranslate(lv);
00229     transl.multMatrixPnt(_rAt);
00230     transl.multMatrixPnt(_rFrom);
00231     return 0.0;
00232 }
00233 
00236 Real32 FlyNavigator::right(Real32 step)
00237 {
00238     Vec3f sv;
00239     sv = _rFrom-_rAt;
00240     sv.crossThis(_vUp);
00241     sv.normalize();
00242     sv *= (step);
00243     Matrix transl;
00244     transl.setIdentity();
00245     transl.setTranslate(sv);
00246     transl.multMatrixPnt(_rAt);
00247     transl.multMatrixPnt(_rFrom);
00248     return 0.0;
00249 }
00250 
00251 
00252 /*-------------------------------------------------------------------------*/
00253 /*                              cvs id's                                   */
00254 
00255 #ifdef __sgi
00256 #pragma set woff 1174
00257 #endif
00258 
00259 #ifdef OSG_LINUX_ICC
00260 #pragma warning( disable : 177 )
00261 #endif
00262 
00263 namespace
00264 {
00265     static Char8 cvsid_cpp       [] = "@(#)$Id: OSGFlyNavigator.cpp,v 1.4 2002/06/13 12:33:11 vossg Exp $";
00266     static Char8 cvsid_hpp       [] = OSGFLYNAVIGATOR_HEADER_CVSID;
00267 
00268     static Char8 cvsid_fields_hpp[] = OSGFLYNAVIGATOR_HEADER_CVSID;
00269 }

Generated on Thu Aug 25 04:04:56 2005 for OpenSG by  doxygen 1.4.3