basic/opengl/GL_Range_Sensor.cpp

Go to the documentation of this file.
00001 #include "OpenGL\GL_Range_Sensor.h"
00002 
00003 #ifndef NOGL
00004 #include "glos.h"
00005 #include <gl\gl.h>
00006 #endif
00007 
00008 GL_Range_Sensor::GL_Range_Sensor (const GL_Range_Sensor& right)
00009 
00010   : Range_Sensor( right )
00011 {
00012 }
00013 
00014 GL_Range_Sensor::GL_Range_Sensor (FrameManager* frameManager)
00015   :Range_Sensor( frameManager )
00016 {
00017 }
00018 
00019 
00020 GL_Range_Sensor::~GL_Range_Sensor()
00021 {
00022 }
00023 
00024 
00025 Entity* GL_Range_Sensor::Clone () const
00026 {
00027         return new GL_Range_Sensor( *this ) ;
00028 }
00029 
00030 
00031 bool GL_Range_Sensor::DrawExplicit () const
00032 {
00033         //TRACE("\nRange_Sensor::Generate_Ray_Array");
00034         int i,j;
00035 
00036         //generate inital ray array
00037 
00038         double newdir[3], temp[3];
00039 
00040         //tempvalues stores normalized rotation matrix needing scaling according to this->angle
00041         double tempvalues[3][3]; 
00042         double rayedgevalues[4][3];
00043         double pyramidvert[4][3];
00044 
00045         double angleratio;
00046 
00047         //can't access the protected absFrame member of Range_Sensor for some reason... so use what was
00048         //defined already in Range_Sensor ancestor
00049 
00050         //shoot rays in x direction from 0,0,0
00051         newdir[0] = ray_half_limit*this->absFrame.values[0][0];
00052         newdir[1] = ray_half_limit*this->absFrame.values[1][0];
00053         newdir[2] = ray_half_limit*this->absFrame.values[2][0];
00054 
00055         //calculate maximum extents for pre-normalized y,z directions
00056         angleratio = tan((this->angle)/2);
00057         for (i=0; i< 3; i++)
00058         {
00059                 for (j=0; j < 3; j++)
00060                 {
00061                         tempvalues[i][j] = angleratio * this->absFrame.values[i][j];
00062                 }
00063         }
00064 
00065         //define ray targets in y direction
00066         temp[0] = newdir[0] + (lower_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00067         temp[1] = newdir[1] + (lower_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00068         temp[2] = newdir[2] + (lower_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00069         //define ray targets in z direction
00070         rayedgevalues[0][0] = temp[0] + (lower_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00071         rayedgevalues[0][1] = temp[1] + (lower_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00072         rayedgevalues[0][2] = temp[2] + (lower_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00073         normalize ( rayedgevalues[0][0], rayedgevalues[0][1], rayedgevalues[0][2] );
00074 
00075         //define ray targets in y direction
00076         temp[0] = newdir[0] + (lower_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00077         temp[1] = newdir[1] + (lower_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00078         temp[2] = newdir[2] + (lower_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00079         //define ray targets in z direction
00080         rayedgevalues[1][0] = temp[0] + (upper_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00081         rayedgevalues[1][1] = temp[1] + (upper_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00082         rayedgevalues[1][2] = temp[2] + (upper_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00083         normalize ( rayedgevalues[1][0], rayedgevalues[1][1], rayedgevalues[1][2] );
00084 
00085         //define ray targets in y direction
00086         temp[0] = newdir[0] + (upper_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00087         temp[1] = newdir[1] + (upper_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00088         temp[2] = newdir[2] + (upper_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00089         //define ray targets in z direction
00090         rayedgevalues[2][0] = temp[0] + (upper_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00091         rayedgevalues[2][1] = temp[1] + (upper_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00092         rayedgevalues[2][2] = temp[2] + (upper_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00093         normalize ( rayedgevalues[2][0], rayedgevalues[2][1], rayedgevalues[2][2] );
00094 
00095         //define ray targets in y direction
00096         temp[0] = newdir[0] + (upper_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00097         temp[1] = newdir[1] + (upper_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00098         temp[2] = newdir[2] + (upper_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00099         //define ray targets in z direction
00100         rayedgevalues[3][0] = temp[0] + (lower_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00101         rayedgevalues[3][1] = temp[1] + (lower_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00102         rayedgevalues[3][2] = temp[2] + (lower_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00103         normalize ( rayedgevalues[3][0], rayedgevalues[3][1], rayedgevalues[3][2] );
00104 
00105 #ifndef NOGL
00106         //disable the lighting - this is being drawn in wireframe
00107         glPushAttrib( GL_ENABLE_BIT );
00108         glDisable( GL_LIGHTING );
00109 
00110         //rayedgevalues have been generated, now find the pyramid base points.
00111         for (i=0; i < 4; i++)
00112         {
00113                 pyramidvert[i][0] = absFrame.values[0][3] + rayedgevalues[i][0] * maxrange;
00114                 pyramidvert[i][1] = absFrame.values[1][3] + rayedgevalues[i][1] * maxrange;
00115                 pyramidvert[i][2] = absFrame.values[2][3] + rayedgevalues[i][2] * maxrange;
00116 
00117                 glBegin( GL_LINES ) ;
00118                 glVertex3d( absFrame.values[0][3], absFrame.values[1][3], absFrame.values[2][3] ) ;
00119                 glVertex3d( pyramidvert[i][0], pyramidvert[i][1], pyramidvert[i][2] ) ;
00120                 glEnd() ;
00121                 //TRACE("\npyramidvert %d, is %f,%f,%f", i, pyramidvert[i][0], pyramidvert[i][1], pyramidvert[i][2] );
00122         }
00123 
00124         for (i=0; i < 3; i++)
00125         {
00126                 glBegin( GL_LINES ) ;
00127                 glVertex3d( pyramidvert[i][0], pyramidvert[i][1], pyramidvert[i][2] ) ;
00128                 glVertex3d( pyramidvert[i+1][0], pyramidvert[i+1][1], pyramidvert[i+1][2] ) ;
00129                 glEnd() ;
00130         }
00131         glBegin( GL_LINES ) ;
00132         glVertex3d( pyramidvert[3][0], pyramidvert[3][1], pyramidvert[3][2] ) ;
00133         glVertex3d( pyramidvert[0][0], pyramidvert[0][1], pyramidvert[0][2] ) ;
00134         glEnd() ;
00135         glPopAttrib();
00136 #endif
00137         return true ;
00138 }

Generated on Sat Apr 1 21:30:35 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO