Revision: 6671
http://playerstage.svn.sourceforge.net/playerstage/?rev=6671&view=rev
Author: alexcb
Date: 2008-06-23 17:31:46 -0700 (Mon, 23 Jun 2008)
Log Message:
-----------
camera model visualization draws a square based off normal vector rather than
adjacent vertices
Modified Paths:
--------------
code/stage/trunk/libstage/model_camera.cc
Modified: code/stage/trunk/libstage/model_camera.cc
===================================================================
--- code/stage/trunk/libstage/model_camera.cc 2008-06-23 22:51:30 UTC (rev
6670)
+++ code/stage/trunk/libstage/model_camera.cc 2008-06-24 00:31:46 UTC (rev
6671)
@@ -14,7 +14,21 @@
#include <sstream>
#include <iomanip>
+//caclulate the corss product, and store results in the first vertex
+void cross( float& x1, float& y1, float& z1, float x2, float y2, float z2 )
+{
+ float x3, y3, z3;
+
+ x3 = y1 * z2 - z1 * y2;
+ y3 = z1 * x2 - x1 * z2;
+ z3 = x1 * y2 - y1 * x2;
+
+ x1 = x3;
+ y1 = y3;
+ z1 = z3;
+}
+
StgModelCamera::StgModelCamera( StgWorld* world, StgModel* parent )
: StgModel( world, parent, MODEL_TYPE_CAMERA ),
_frame_data( NULL ), _frame_color_data( NULL ),
@@ -103,7 +117,8 @@
glViewport( 0, 0, _width, _height );
_camera.update();
_camera.SetProjection();
- _camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y,
0.1 );
+ //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.setYaw( rtod( parent->GetGlobalPose().a ) - 90.0 + _yaw_offset
); //-90.0 points the camera infront of the robot instead of pointing right
_camera.Draw();
@@ -236,6 +251,7 @@
//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 )
@@ -256,6 +272,11 @@
_valid_vertexbuf_cache = true;
}
+
+ glDisable (GL_CULL_FACE);
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+ glBegin( GL_QUADS );
+
//Scale cached unit vectors with depth-buffer
float* depth_data = ( float* )( _frame_data );
for( int j = 0; j < h; j++ ) {
@@ -263,7 +284,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;
//TODO might be buggy indexing
+ const GLubyte* color = _frame_color_data + index * 4;
//make this const
const float length = depth_data[ index ];
//scale unitvectors with depth-buffer
@@ -278,18 +299,37 @@
scaled_vertex->b = color[ 2 ];
scaled_vertex->a = 0xFF;
+ //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;
+ cross( x, y, z, unit_vertex->x, unit_vertex->y,
unit_vertex->z );
+
+ float y_height = 0.05 * length;
+
+ 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 );
+
}
}
+ glEnd();
+ return;
- //draw then camera data
- glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
- glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); //Can also be GL_FILL -
but harder to debug
- glInterleavedArrays( GL_C4UB_V3F, 0, _vertexbuf_scaled );
- glDrawElements( GL_QUADS, 4 * (w-1) * (h-1), GL_UNSIGNED_SHORT,
_vertexbuf_scaled_index );
- glPopClientAttrib();
+ //TODO see if any of this can be used for the new method
+ //TODO: below this point may no longer be needed if we just draw
perfectly square quads based off normal
+// //draw then camera data
+// glDisable (GL_CULL_FACE);
+// glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
+// glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); //Can also be GL_FILL -
but harder to debug
+// glInterleavedArrays( GL_C4UB_V3F, 0, vertices );
+// glDrawElements( GL_QUADS, 4 * w * h, GL_UNSIGNED_SHORT, vertices_index
);
+// glPopClientAttrib();
+//
-
}
void StgModelCamera::Draw( uint32_t flags, StgCanvas* canvas )
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