00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
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
00050
00051
00081
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
00093
00094 FlyNavigator::~FlyNavigator()
00095 {
00096 }
00097
00098
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
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
00174
00178 void FlyNavigator::rotate(Real32 deltaX, Real32 deltaY)
00179 {
00180
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
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
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 }