Revision: 6680
http://playerstage.svn.sourceforge.net/playerstage/?rev=6680&view=rev
Author: alexcb
Date: 2008-06-24 17:10:08 -0700 (Tue, 24 Jun 2008)
Log Message:
-----------
camera model visualization normal vector bug fix, and added camera reset
ctrl+Spacebar
Modified Paths:
--------------
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/model_camera.cc
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-06-24 18:37:10 UTC (rev 6679)
+++ code/stage/trunk/libstage/canvas.cc 2008-06-25 00:10:08 UTC (rev 6680)
@@ -20,7 +20,6 @@
static const int checkImageHeight = 2;
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLuint texName;
-static bool canvas_init_done = false;
void StgCanvas::TimerCallback( StgCanvas* c )
{
@@ -360,6 +359,11 @@
case ' ': // space bar
camera.resetAngle();
//invalidate();
+ if( Fl::event_state( FL_CTRL ) ) {
+ //do a complete reset
+ camera.setPose( 0.0, 0.0 );
+ camera.setScale( 10.0 );
+ }
redraw();
break;
case FL_Left: camera.move( -10, 0 ); break;
@@ -439,6 +443,7 @@
glDisable(GL_POLYGON_OFFSET_FILL );
}
+//draw the floor without any grid ( for robot's perspective camera model )
void StgCanvas::DrawFloor()
{
stg_bounds3d_t bounds = world->GetExtent();
@@ -449,6 +454,8 @@
glVertex3f( bounds.x.max, bounds.y.max, 0 );
glVertex3f( bounds.x.min, bounds.y.max, 0 );
glEnd();
+
+ glEnd();
}
void StgCanvas::renderFrame( bool robot_camera )
@@ -687,31 +694,60 @@
// set gl state that won't change every redraw
glClearColor ( 0.7, 0.7, 0.8, 1.0);
//glClearColor ( 1,1,1,1 );
- glDisable(GL_LIGHTING);
- glEnable (GL_DEPTH_TEST);
- glDepthFunc (GL_LESS);
+ glDisable( GL_LIGHTING );
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LESS );
glCullFace( GL_BACK );
glEnable (GL_CULL_FACE);
glEnable( GL_BLEND );
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_LINE_SMOOTH );
- glHint (GL_LINE_SMOOTH_HINT, GL_FASTEST);
- glDepthMask(GL_TRUE);
+ glHint( GL_LINE_SMOOTH_HINT, GL_FASTEST );
+ glDepthMask( GL_TRUE );
glEnable( GL_TEXTURE_2D );
//TODO find a better home for loading textures
if( loaded_texture == false ) {
- std::string fullpath;
- fullpath = world->fileMan->fullPath( "stall.png" );
+ std::string fullpath = world->fileMan->fullPath(
"stall.png" );
if ( fullpath == "" ) {
PRINT_DEBUG( "Unable to load texture.\n" );
}
GLuint stall_id =
TextureManager::getInstance().loadTexture( fullpath.c_str() );
-
TextureManager::getInstance()._stall_texture_id =
stall_id;
+ //create floor texture
+ {
+ //TODO merge this code into the textureManager
+ int i, j, c;
+ for (i = 0; i < checkImageHeight; i++)
+ for (j = 0; j < checkImageWidth; j++)
+ {
+ int even = (i+j)%2;
+ checkImage[i][j][0] = (GLubyte)
255 - 10*even;
+ checkImage[i][j][1] = (GLubyte)
255 - 10*even;
+ checkImage[i][j][2] = (GLubyte)
255;// - 5*even;
+ checkImage[i][j][3] = 255;
+ }
+
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glGenTextures(1, &texName);
+ glBindTexture(GL_TEXTURE_2D, texName);
+ glEnable(GL_TEXTURE_2D);
+
+ glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
checkImageWidth, checkImageHeight,
+ 0, GL_RGBA,
GL_UNSIGNED_BYTE, checkImage);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
+ }
+
loaded_texture = true;
}
@@ -731,39 +767,7 @@
glEnableClientState( GL_VERTEX_ARRAY );
//glEnableClientState( GL_COLOR_ARRAY );
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
- if( ! canvas_init_done ) // do a bit of texture setup
- {
- canvas_init_done = true;
- int i, j, c;
- for (i = 0; i < checkImageHeight; i++)
- for (j = 0; j < checkImageWidth; j++)
- {
- int even = (i+j)%2;
- checkImage[i][j][0] = (GLubyte) 255 -
10*even;
- checkImage[i][j][1] = (GLubyte) 255 -
10*even;
- checkImage[i][j][2] = (GLubyte) 255;//
- 5*even;
- checkImage[i][j][3] = 255;
- }
-
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glGenTextures(1, &texName);
- glBindTexture(GL_TEXTURE_2D, texName);
- glEnable(GL_TEXTURE_2D);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
-
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
checkImageWidth, checkImageHeight,
- 0, GL_RGBA, GL_UNSIGNED_BYTE,
checkImage);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
- }
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
}
Modified: code/stage/trunk/libstage/model_camera.cc
===================================================================
--- code/stage/trunk/libstage/model_camera.cc 2008-06-24 18:37:10 UTC (rev
6679)
+++ code/stage/trunk/libstage/model_camera.cc 2008-06-25 00:10:08 UTC (rev
6680)
@@ -8,6 +8,7 @@
//
///////////////////////////////////////////////////////////////////////////
+#define CAMERA_HEIGHT 0.5
//#define DEBUG 1
#include "stage_internal.hh"
@@ -114,26 +115,33 @@
_vertexbuf_scaled_index = new GLushort[ 4 * (_width-1) *
(_height-1) ]; //for indicies to draw a quad
}
+ //TODO overcome issue when glviewport is set LARGER than the window side
+ //currently it just clips and draws outside areas black - resulting in
bad glreadpixel data
+ if( _width > _canvas->w() )
+ _width = _canvas->w();
+ if( _height > _canvas->h() )
+ _height = _canvas->h();
+
glViewport( 0, 0, _width, _height );
_camera.update();
_camera.SetProjection();
//TODO reposition the camera so it isn't inside the model ( or don't
draw the parent when calling renderframe )
- _camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y,
0.5 ); //0.5 is a bit too high (but lower values can end up inside the model
+ _camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y,
CAMERA_HEIGHT ); //TODO use something smarter than a #define - make it
configurable
_camera.setYaw( rtod( parent->GetGlobalPose().a ) - 90.0 + _yaw_offset
); //-90.0 points the camera infront of the robot instead of pointing right
_camera.Draw();
_canvas->renderFrame( true );
//read depth buffer
- glReadPixels(0, 0, _width, _height,
+ glReadPixels(0, 0, _width, _height,
GL_DEPTH_COMPONENT, //GL_RGB,
GL_FLOAT, //GL_UNSIGNED_BYTE,
_frame_data );
- //transform length into linear length
- float* data = ( float* )( _frame_data ); //TODO use static_cast
here
- int buf_size = _width * _height;
- for( int i = 0; i < buf_size; i++ )
- data[ i ] = _camera.realDistance( data[ i ] ) + 0.1;
+ //transform length into linear length
+ float* data = ( float* )( _frame_data ); //TODO use static_cast here
+ int buf_size = _width * _height;
+ for( int i = 0; i < buf_size; i++ )
+ data[ i ] = _camera.realDistance( data[ i ] );
//read color buffer
glReadPixels(0, 0, _width, _height,
@@ -146,6 +154,7 @@
return NULL; //_frame_data;
}
+//TODO get rid of this
void StgModelCamera::PrintData( void ) const
{
//create depth matrix
@@ -197,20 +206,16 @@
float center_horiz = - _yaw_offset;
float center_vert = 0; // - _pitch_offset;
- float start_fov = center_horiz + w_fov / 2.0; //start at right
- float start_vert_fov = center_vert + h_fov / 2.0; //start at top
+ float start_fov = center_horiz + w_fov / 2.0 + 180.0; //start at right
+ float start_vert_fov = center_vert + h_fov / 2.0 + 90.0; //start at top
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); //TODO this doesn't seem
to work.
int w = _width;
int h = _height;
- float a;
- float vert_a;
float a_space = w_fov / w; //degrees between each sample
float vert_a_space = h_fov / h; //degrees between each vertical sample
- float x, y, z;
- float tmp_x, tmp_y, tmp_z;
//TODO - there are still some vertices which aren't accurate - possibly
due to a buffer overflow / memory corruption.
@@ -219,61 +224,23 @@
for( int j = 0; j < h; j++ ) {
for( int i = 0; i < w; i++ ) {
- a = start_fov - static_cast< float >( i ) *
a_space;
- vert_a = start_vert_fov - static_cast< float >(
j ) * vert_a_space;
+ float a = start_fov - static_cast< float >( i )
* a_space;
+ float vert_a = start_vert_fov - static_cast<
float >( h - j - 1 ) * vert_a_space;
- //calculate based on a unit vector, which is
scaled later on (this reduces all the sin/cos/dtor calls)
- x = 1;
- y = 0;
- z = 0;
-
- //rotate about z by a
- tmp_x = x * cos( dtor( a ) ); // - y *sin( but
y=0)
- tmp_y = x * sin( dtor( a ) ); // + y * cos( but
y=0 )
- tmp_z = z;
-
- x = tmp_x; y = tmp_y; z = tmp_z;
-
- //rotate about x
- tmp_z = - x * sin( dtor( vert_a ) );
- tmp_x = x * cos( dtor( vert_a ) );
-
- x = tmp_x;
- y = tmp_y;
- z = tmp_z;
-
int index = i + j * w;
ColoredVertex* vertex = _vertexbuf_cache +
index;
- vertex->x = x;
- vertex->y = y;
- vertex->z = z;
-
- //TODO move the quad generate to the same
section as scalling code, and only insert a quad when the distance between
vertices isn't too large (i.e. spanning from a wall to sky)
- //It might also be possible to write a shader
which would scale vertices and create quads instead of doing it here on the CPU.
- //TODO: below this point may no longer be
needed if we just draw perfectly square quads based off normal
-
- //skip top and left boarders
- if( i == 0 || j == 0 )
- continue;
-
- //decrement i and j, since the first boarders
were skipped
- //note: the width of this array is (w-1) since
it contains QUADS between the vertices
- GLushort* p = _vertexbuf_scaled_index + ( (i-1)
+ (j-1) * (w-1) ) * 4;
-
- //create quad growing adjacent point on top
left (use width of `w' since these are VERTICES)
- p[ 0 ] = i + j * w;
- p[ 1 ] = i - 1 + j * w;
- p[ 2 ] = i - 1 + ( j - 1 ) * w;
- p[ 3 ] = i + ( j - 1 ) * w;
-
+ //calculate and cache normal unit vectors of
the sphere
+ vertex->x = -sin( dtor( vert_a ) ) * cos( dtor(
a ) );
+ vertex->y = -sin( dtor( vert_a ) ) * sin( dtor(
a ) );
+ vertex->z = -cos( dtor( vert_a ) );
}
}
_valid_vertexbuf_cache = true;
}
-
- glDisable (GL_CULL_FACE);
+ glTranslatef( 0, 0, CAMERA_HEIGHT / 2.0 );
+ glDisable( GL_CULL_FACE );
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glBegin( GL_QUADS );
@@ -284,7 +251,7 @@
int index = i + j * w;
const ColoredVertex* unit_vertex = _vertexbuf_cache +
index;
ColoredVertex* scaled_vertex = _vertexbuf_scaled +
index;
- const GLubyte* color = _frame_color_data + index * 4;
//make this const
+ const GLubyte* color = _frame_color_data + index * 4;
const float length = depth_data[ index ];
//scale unitvectors with depth-buffer
@@ -302,21 +269,23 @@
//create a quad based on the current camera pixel, and
normal vector
//the quad size is porpotial to the depth distance
float x, y, z;
- x = 0; y = 0.05 * length; z=0;
+ x = 0; y = 0; z = length * M_PI * a_space / 360.0;
cross( x, y, z, unit_vertex->x, unit_vertex->y,
unit_vertex->z );
- float y_height = 0.05 * length;
-
+ z = length * M_PI * vert_a_space / 360.0;
+
glColor4ub( color[ 0 ], color[ 1 ], color[ 2 ], 0xFF );
- glVertex3f( scaled_vertex->x - x, scaled_vertex->y -
y_height, scaled_vertex->z - z );
- glVertex3f( scaled_vertex->x - x, scaled_vertex->y +
y_height, scaled_vertex->z - z );
- glVertex3f( scaled_vertex->x + x, scaled_vertex->y +
y_height, scaled_vertex->z + z );
- glVertex3f( scaled_vertex->x + x, scaled_vertex->y -
y_height, scaled_vertex->z + z );
+
+ glVertex3f( scaled_vertex->x - x, scaled_vertex->y - y,
scaled_vertex->z - z );
+ glVertex3f( scaled_vertex->x - x, scaled_vertex->y - y,
scaled_vertex->z + z );
+ glVertex3f( scaled_vertex->x + x, scaled_vertex->y + y,
scaled_vertex->z + z );
+ glVertex3f( scaled_vertex->x + x, scaled_vertex->y + y,
scaled_vertex->z - z );
}
}
glEnd();
+ glEnable(GL_CULL_FACE);
return;
//TODO see if any of this can be used for the new method
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit