From: <al...@us...> - 2008-06-12 16:35:21
|
Revision: 6552 http://playerstage.svn.sourceforge.net/playerstage/?rev=6552&view=rev Author: alexcb Date: 2008-06-12 16:35:26 -0700 (Thu, 12 Jun 2008) Log Message: ----------- camera model refactoring Modified Paths: -------------- code/stage/trunk/libstage/camera.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model.cc code/stage/trunk/libstage/model_camera.cc code/stage/trunk/libstage/stage.hh Modified: code/stage/trunk/libstage/camera.cc =================================================================== --- code/stage/trunk/libstage/camera.cc 2008-06-12 23:35:17 UTC (rev 6551) +++ code/stage/trunk/libstage/camera.cc 2008-06-12 23:35:26 UTC (rev 6552) @@ -14,7 +14,7 @@ //perspective camera //perspective camera StgPerspectiveCamera::StgPerspectiveCamera( void ) : - _x( 0 ), _y( 0 ), _z( 0 ), _pitch( 90 ), _yaw( 0 ), _z_near( 0.1 ), _z_far( 20.0 ) + _x( 0 ), _y( 0 ), _z( 0 ), _pitch( 90 ), _yaw( 0 ), _z_near( 0.2 ), _z_far( 40.0 ), _fov( 60 ) { } @@ -33,12 +33,7 @@ void StgPerspectiveCamera::SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ) const { - glMatrixMode (GL_PROJECTION); - glLoadIdentity (); - - gluPerspective( 60.0, pixels_width/pixels_height, _z_near, _z_far ); - - glMatrixMode (GL_MODELVIEW); + SetProjection( pixels_width/pixels_height ); } void StgPerspectiveCamera::SetProjection( float aspect ) const @@ -46,7 +41,7 @@ glMatrixMode (GL_PROJECTION); glLoadIdentity (); - gluPerspective( 60.0, aspect, _z_near, _z_far ); + gluPerspective( _fov, aspect, _z_near, _z_far ); glMatrixMode (GL_MODELVIEW); } Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-06-12 23:35:17 UTC (rev 6551) +++ code/stage/trunk/libstage/canvas.cc 2008-06-12 23:35:26 UTC (rev 6552) @@ -34,7 +34,7 @@ use_perspective_camera = false; perspective_camera.setPose( -3.0, 0.0, 1.0 ); - perspective_camera._pitch = 70.0; //look down + perspective_camera.setPitch( 70.0 ); //look down startx = starty = 0; //panx = pany = stheta = sphi = 0.0; @@ -175,7 +175,7 @@ else { if( use_perspective_camera == true ) { - perspective_camera._z += Fl::event_dy() / 10.0; + perspective_camera.scroll( Fl::event_dy() / 10.0 ); } else { camera.scale( Fl::event_dy(), Fl::event_x(), w(), Fl::event_y(), h() ); } @@ -190,8 +190,8 @@ int dy = Fl::event_y() - starty; if( use_perspective_camera == true ) { - perspective_camera._yaw += -dx; - perspective_camera._pitch += -dy; + perspective_camera.addYaw( -dx ); + perspective_camera.addPitch( -dy ); } else { camera.pitch( 0.5 * static_cast<double>( dy ) ); camera.yaw( 0.5 * static_cast<double>( dx ) ); @@ -205,8 +205,7 @@ int dy = Fl::event_y() - starty; if( use_perspective_camera == true ) { - perspective_camera._x += -dx / 100.0 * perspective_camera._z; - perspective_camera._y += dy / 100.0 * perspective_camera._z; + perspective_camera.move( -dx, dy, 0.0 ); } else { camera.move( -dx, dy ); @@ -359,15 +358,13 @@ void StgCanvas::renderFrame( bool robot_camera ) { - uint32_t showflags = this->showflags; if( robot_camera == true ) showflags = STG_SHOW_BLOCKS; - if( ! (showflags & STG_SHOW_TRAILS) || robot_camera ) + if( ! (showflags & STG_SHOW_TRAILS) || robot_camera == true ) glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - glPushMatrix(); // draw the world size rectangle in white, using the polygon offset @@ -532,9 +529,11 @@ void StgCanvas::draw() { static bool loaded_texture = false; - // static int centerx = 0, centery = 0; - //puts( "CANVAS" ); + //Enable the following to debug camera model +// if( loaded_texture == true && use_perspective_camera == true ) +// return; + if (!valid()) { valid(1); Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-06-12 23:35:17 UTC (rev 6551) +++ code/stage/trunk/libstage/model.cc 2008-06-12 23:35:26 UTC (rev 6552) @@ -967,7 +967,7 @@ DrawBlinkenlights(); // draw speech bubble - if( this->say_string ) + if( say_string && flags & STG_SHOW_STATUS ) { float stheta = -dtor( canvas->camera.getPitch() ); float sphi = dtor( canvas->camera.getYaw() ); Modified: code/stage/trunk/libstage/model_camera.cc =================================================================== --- code/stage/trunk/libstage/model_camera.cc 2008-06-12 23:35:17 UTC (rev 6551) +++ code/stage/trunk/libstage/model_camera.cc 2008-06-12 23:35:26 UTC (rev 6552) @@ -55,7 +55,11 @@ { StgModel::Load(); Worldfile* wf = world->GetWorldFile(); - + int fov = wf->ReadLength( id, "fov", -1 ); + if( fov > 0 ) { + _camera.setFov( fov ); + } + } @@ -66,11 +70,10 @@ float* StgModelCamera::laser() { - int h = 32; - int w = 32; + //TODO allow the h and w to be passed by user + int h = 320; + int w = 320; - static StgPerspectiveCamera camera; - static GLfloat* data_gl = NULL; static GLfloat* data = NULL; if( data == NULL ) { @@ -80,20 +83,25 @@ } glViewport( 0, 0, w, h ); - camera.update(); - camera.SetProjection( 1.0 ); + _camera.update(); + _camera.SetProjection( 1.0 ); - camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y, 0.1 ); - camera.setYaw( rtod( parent->GetGlobalPose().a ) - 90.0 ); - camera.Draw(); + _camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y, 0.3 ); + _camera.setYaw( rtod( parent->GetGlobalPose().a ) - 90.0 ); + _camera.Draw(); _canvas->renderFrame( true ); glReadPixels(0, h / 2, w, 1, GL_DEPTH_COMPONENT, GL_FLOAT, data_gl ); for( int i = 0; i < w; i++ ) { - data[ w-1-i ] = camera.realDistance( data_gl[ i ] ); + data[ w-1-i ] = _camera.realDistance( data_gl[ i ] ); } + for( int i = 0; i < 32; i++ ) { + for( int j = 1; j < 10; j++ ) + data[ i ] += data[ i * 10 + j ]; + data[ i ] /= 10.0; + } _canvas->invalidate(); return data; } Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-06-12 23:35:17 UTC (rev 6551) +++ code/stage/trunk/libstage/stage.hh 2008-06-12 23:35:26 UTC (rev 6552) @@ -521,6 +521,7 @@ const uint32_t STG_SHOW_FOOTPRINT = (1<<10); const uint32_t STG_SHOW_BLOCKS_2D = (1<<10); const uint32_t STG_SHOW_TRAILRISE = (1<<11); + const uint32_t STG_SHOW_STATUS = (1<<12); // forward declare class StgWorld; @@ -1712,13 +1713,14 @@ class StgPerspectiveCamera : public StgCamera { - public: //TODO make this private + private: float _x, _y, _z; float _pitch; //left-right (about y) float _yaw; //up-down (about x) - private: + float _z_near; float _z_far; + float _fov; public: StgPerspectiveCamera( void ); @@ -1729,13 +1731,33 @@ void update( void ); inline void setPose( float x, float y, float z ) { _x = x; _y = y; _z = z; } + inline void addPose( float x, float y, float z ) { _x += x; _y += y; _z += z; if( _z < 0.1 ) _z = 0.1; } + inline void move( float x, float y, float z ) + { + //scale relative to zoom level + _x *= _z; + _y *= _z; + + //adjust for yaw angle + std::cout << "yaw:" << _yaw << std::endl; + _x += cos( dtor( _yaw ) ) * x; + _y += -sin( dtor( _yaw ) ) * x; + + _x += sin( dtor( _yaw ) ) * y; + _y += cos( dtor( _yaw ) ) * y; + } + inline void setFov( float fov ) { _fov = fov; } inline void setYaw( float yaw ) { _yaw = yaw; } + inline void addYaw( float yaw ) { _yaw += yaw; } + inline void setPitch( float pitch ) { _pitch = pitch; } + inline void addPitch( float pitch ) { _pitch += pitch; } inline float realDistance( float z_buf_val ) const { //formulat found at http://www.cs.unc.edu/~hoff/techrep/openglz.html //Z = Zn*Zf / (Zf - z*(Zf-Zn)) return _z_near * _z_far / ( _z_far - z_buf_val * ( _z_far - _z_near ) ); } + inline void scroll( float dy ) { _z += dy; } }; class StgOrthoCamera : public StgCamera @@ -1759,7 +1781,7 @@ //adjust for pitch angle y = y / cos( dtor( _pitch ) ); - //adjust for yaw andle + //adjust for yaw angle _x += cos( dtor( _yaw ) ) * x; _y += -sin( dtor( _yaw ) ) * x; @@ -2369,6 +2391,8 @@ int _frame_data_width; int _frame_data_height; + StgPerspectiveCamera _camera; + public: StgModelCamera( StgWorld* world, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |