drawing.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:8k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. #include "drawing.h"
  2. #include <GL/glut.h>
  3. #include <math.h>
  4. #include "gsub.h"
  5. //#include "util.h"
  6. static GLUquadric *quadric = gluNewQuadric();
  7. void drawBullseye( double radius, int rings )
  8. {
  9.   int divs = ( rings * 2 ) - 1;
  10.   double r = radius / (double) divs;
  11.   gluQuadricDrawStyle( quadric, GLU_FILL );
  12.   gluQuadricOrientation( quadric, GLU_OUTSIDE );
  13.   gluQuadricNormals( quadric, GLU_SMOOTH );
  14.   glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  15.   glEnable( GL_BLEND );
  16.   glPushMatrix();
  17.   glTranslatef( 0.0, 0.0, -0.5 );
  18.   for( int i = 0 ; i < rings ; ++i )
  19.     gluDisk( quadric, i * 2 * r, ( i * 2 + 1 ) * r, 16, 1 );
  20.   // north marker
  21.   glBegin(GL_QUADS);
  22.     double w = radius/10;
  23.     double f = radius;
  24.     double t = radius*1.2;
  25.     glVertex3d(w, f, 0);
  26.     glVertex3d(w, t, 0);
  27.     glVertex3d(-w, t, 0);
  28.     glVertex3d(-w, f, 0);
  29.   glEnd();
  30.   glPopMatrix();
  31.   glDisable( GL_BLEND );
  32. }
  33. void drawMulti( ARMultiMarkerInfoT *m )
  34. {
  35.   double multiglmatrix[16];
  36.   double glmatrix[16];
  37.   argConvGlparad( m->trans, multiglmatrix );
  38.   argDrawMode3D();
  39.   argDraw3dCamera( 0, 0 );
  40.   glDepthFunc( GL_LEQUAL );
  41.   glEnable( GL_DEPTH_TEST );
  42.   glDisable( GL_TEXTURE_2D );
  43.   glDisable( GL_LIGHTING );
  44.   glDisable( GL_NORMALIZE );
  45.   glMatrixMode( GL_MODELVIEW );
  46.   glPushMatrix();
  47.   glMultMatrixd( multiglmatrix );
  48.   for( int i = 0 ; i < m->marker_num ; ++i )
  49.   {
  50.     double w = m->marker[i].width / 2.0;
  51.     if( m->marker[i].visible >= 0 )
  52.       glColor4f( 1.0, 1.0, 1.0, 0.3 );
  53.     else
  54.       glColor4f( 1.0, 1.0, 0.0, 0.1 );
  55.     argConvGlparad( m->marker[i].trans, glmatrix );
  56.     glPushMatrix();
  57.     glMultMatrixd( glmatrix );
  58.     drawBullseye( w * 1.5, 3 );
  59. /*
  60.     glBegin( GL_QUADS );
  61.       glVertex3f( m->marker[i].center[0] - w, 
  62.                   m->marker[i].center[1] - w,
  63.                   0.0
  64.                 );
  65.       glVertex3f( m->marker[i].center[0] + w, 
  66.                   m->marker[i].center[1] - w,
  67.                   0.0
  68.                 );
  69.       glVertex3f( m->marker[i].center[0] + w, 
  70.                   m->marker[i].center[1] + w,
  71.                   0.0
  72.                 );
  73.       glVertex3f( m->marker[i].center[0] - w, 
  74.                   m->marker[i].center[1] + w,
  75.                   0.0
  76.                 );
  77.     glEnd();
  78. */
  79.     glPopMatrix();
  80.   }
  81.   glPopMatrix();
  82. }
  83. void drawMarker( Marker *m )
  84. {
  85.   double w = m->width / 2.0;
  86.   double glmatrix[16];
  87.   argConvGlparad( m->trans, glmatrix );
  88.   argDrawMode3D();
  89.   argDraw3dCamera( 0, 0 );
  90.   glDepthFunc( GL_LEQUAL );
  91.   glEnable( GL_DEPTH_TEST );
  92.   glDisable( GL_TEXTURE_2D );
  93.   glDisable( GL_LIGHTING );
  94.   glDisable( GL_NORMALIZE );
  95.   glMatrixMode( GL_MODELVIEW );
  96.   glPushMatrix();   
  97.   glMultMatrixd( glmatrix );
  98.   glColor4f( 1.0, 0.0, 0.0, 0.5 );
  99.   drawBullseye( w * 1.5, 3 );
  100. /*
  101.   double b = 0;
  102.   glBegin( GL_QUADS );
  103.     glVertex3f( m->center[0] - w - b, m->center[1] - w - b, -0.1 );
  104.     glVertex3f( m->center[0] + w + b, m->center[1] - w - b, -0.1 );
  105.     glVertex3f( m->center[0] + w + b, m->center[1] + w + b, -0.1 );
  106.     glVertex3f( m->center[0] - w - b, m->center[1] + w + b, -0.1 );
  107.   glEnd();
  108. */
  109.       
  110.   glPopMatrix();
  111. }
  112. /*
  113. void selectDrawApp3d( app3dint *app, double trans[][4] )
  114. {
  115.   glMatrixMode( GL_PROJECTION );
  116.   glPushMatrix();
  117.   argDrawMode3D();
  118.   argMult3dCamera( 0, 0 );
  119.   glDepthFunc( GL_LEQUAL );
  120.   glEnable( GL_DEPTH_TEST );
  121.   glDisable( GL_LIGHTING );
  122.   glDisable( GL_TEXTURE_2D );
  123.   glDisable( GL_NORMALIZE );
  124.   glDisable( GL_CULL_FACE );
  125.   glMatrixMode( GL_MODELVIEW );
  126.   glPushMatrix();
  127.   app->drawFunc( trans );
  128.   glMatrixMode( GL_MODELVIEW );
  129.   glPopMatrix();
  130.   glMatrixMode( GL_PROJECTION );
  131.   glPopMatrix();
  132. */
  133. void enableLights()
  134. {
  135.   GLfloat ambient[4] = { 0.2, 0.2, 0.2, 1.0 };
  136.   glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambient );
  137.   
  138.   GLfloat light0[2][4] = { { 10.0, 10.0, -5.0,  0.0 },
  139.                            {  0.7,  0.7,  0.7,  1.0 } };
  140.   glLightfv( GL_LIGHT0, GL_POSITION, light0[0] );
  141.   glLightfv( GL_LIGHT0, GL_DIFFUSE,  light0[1] );
  142.   glLightfv( GL_LIGHT0, GL_SPECULAR, light0[1] );
  143.   glEnable( GL_LIGHT0 );
  144.   
  145.   GLfloat light1[2][4] = { { -10.0, -10.0, -10.0,  0.0 },
  146.                            {   0.7,   0.7,   0.7,  1.0 } };
  147.   glLightfv( GL_LIGHT1, GL_POSITION, light1[0] );
  148.   glLightfv( GL_LIGHT1, GL_DIFFUSE,  light1[1] );
  149.   glLightfv( GL_LIGHT1, GL_SPECULAR, light1[1] );
  150.   glEnable( GL_LIGHT1 ); 
  151.   
  152.   GLfloat light2[2][4] = { { -10.0,  10.0,  0.0,  0.0 },
  153.                            {   0.6,   0.5,  0.3,  1.0 } };
  154.   glLightfv( GL_LIGHT2, GL_POSITION, light2[0] );
  155.   glLightfv( GL_LIGHT2, GL_DIFFUSE,  light2[1] );
  156.   glLightfv( GL_LIGHT2, GL_SPECULAR, light2[1] );
  157.   glEnable( GL_LIGHT2 );
  158.   
  159.   GLfloat light3[2][4] = { {  10.0, -10.0,  0.0,  0.0 },
  160.                            {   0.4,   0.5,  0.6,  1.0 } };
  161.   glLightfv( GL_LIGHT3, GL_POSITION, light3[0] );
  162.   glLightfv( GL_LIGHT3, GL_DIFFUSE,  light3[1] );
  163.   glLightfv( GL_LIGHT3, GL_SPECULAR, light3[1] );
  164.   glEnable( GL_LIGHT3 );
  165. /*
  166. void drawApp3d( app3dint *app, double trans[][4] )
  167. {
  168.   argDrawMode3D();
  169.   argDraw3dCamera( 0, 0 );
  170.   
  171.   glDepthFunc( GL_LEQUAL );
  172.   glEnable( GL_DEPTH_TEST );
  173.   glEnable( GL_LIGHTING );
  174.   glEnable( GL_NORMALIZE );
  175.   glDisable( GL_TEXTURE_2D );
  176.   glDisable( GL_CULL_FACE );
  177.   
  178.   enableLights();
  179.   
  180.   glMatrixMode( GL_MODELVIEW );
  181.   glPushMatrix();
  182.   
  183.   app->drawFunc( trans );
  184.   
  185.   glMatrixMode( GL_MODELVIEW );
  186.   glPopMatrix();
  187. }
  188. static void calcNearnessTransform( double posA[3], double posB[3], 
  189.                                    double offset, double *dist )
  190. {   
  191.   double delta[3];
  192.   delta[0] = posA[0] - posB[0];
  193.   delta[1] = posA[1] - posB[1];
  194.   delta[2] = posA[2] - posB[2];
  195.   *dist = normalize( delta );  
  196.     
  197.   double midpoint[3];
  198.   midpoint[0] = ( posA[0] + posB[0] ) / 2.0;
  199.   midpoint[1] = ( posA[1] + posB[1] ) / 2.0;
  200.   midpoint[2] = ( posA[2] + posB[2] ) / 2.0;
  201.     
  202.   double Xvec[3] = { 1.0, 0.0, 0.0 };
  203.   double Yvec[3] = { 0.0, 1.0, 0.0 };
  204.   double Zvec[3] = { 0.0, 0.0, 1.0 };
  205.   
  206.   double normal[3];   
  207.   crossprod( delta, Yvec, normal );
  208.   normalize( normal );
  209.     
  210.   double rotvec[3];
  211.   crossprod( normal, Zvec, rotvec );
  212.   
  213.   double NdotZ = dotprod( normal, Zvec );
  214.   double angle = - acos( NdotZ ) * 180.0 / M_PI;
  215.     
  216.   double plane[3];
  217.   crossprod( normal, delta, plane );
  218.   normalize( plane );
  219.     
  220.   double sign;
  221.   if( dotprod( delta, Xvec ) < 0 )
  222.     sign = 1;
  223.   else
  224.     sign = -1;
  225.   double theta;
  226.   if( dotprod( plane, Xvec ) < 0 )
  227.     theta = sign * - acos( dotprod( plane, Yvec ) ) * 180.0 / M_PI;
  228.   else
  229.     theta = sign * acos( dotprod( plane, Yvec ) ) * 180.0 / M_PI;
  230.   glTranslatef( plane[0] * offset, plane[1] * offset, plane[2] * offset );  
  231.   glTranslatef( midpoint[0], midpoint[1], midpoint[2] );
  232.   glRotatef( angle, rotvec[0], rotvec[1], rotvec[2] );
  233.   glRotatef( theta, 0.0, 0.0, 1.0 );
  234. void drawNearness( double posA[3], double posB[3] )
  235. {
  236.   GLfloat color[4] = {  0.2,  0.9,  0.4,  1.0 };
  237.                 
  238.   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT,   color );
  239.   glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE,   color );
  240.   glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR,  color );
  241.   glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION,  glBlack );
  242.   glMaterialf ( GL_FRONT_AND_BACK, GL_SHININESS, 0.5 * 128.0 );
  243.                 
  244.   gluQuadricDrawStyle( quadric, GLU_FILL );
  245.   gluQuadricOrientation( quadric, GLU_OUTSIDE );
  246.   gluQuadricNormals( quadric, GLU_SMOOTH );
  247.     
  248.   glDepthFunc( GL_LEQUAL );
  249.   glEnable( GL_DEPTH_TEST );
  250.   glEnable( GL_NORMALIZE );
  251.   glEnable( GL_LIGHTING );
  252.   glDisable( GL_TEXTURE_2D );
  253.   glDisable( GL_CULL_FACE );
  254.   
  255.   argDrawMode3D();
  256.   argDraw3dCamera( 0, 0 );
  257.   
  258.   enableLights();
  259.   glMatrixMode( GL_MODELVIEW );  
  260.   glPushMatrix();
  261.   double diameter;
  262.   calcNearnessTransform( posA, posB, -25.0, &diameter );
  263.   
  264.   GLdouble clipplane[4] = { 0.0, -1.0, 0.0, 0.0 };
  265.   glClipPlane( GL_CLIP_PLANE0, clipplane );
  266.   glEnable( GL_CLIP_PLANE0 );
  267.   
  268.   glutSolidTorus( 5.0, diameter / 2.0, 16, 24 );
  269.  
  270.   glDisable( GL_CLIP_PLANE0 );
  271.   glPushMatrix();
  272.     glTranslatef( diameter / 2.0, 0.0, 0.0 );
  273.     glRotatef( -90.0, 1.0, 0.0, 0.0 );
  274.     gluCylinder( quadric, 10.0, 0.0, 25.0, 16, 1 );
  275.     gluDisk( quadric, 0, 10.0, 16, 1 );
  276.   glPopMatrix();
  277.   
  278.   glPushMatrix();
  279.     glTranslatef( -diameter / 2.0, 0.0, 0.0 );
  280.     glRotatef( -90.0, 1.0, 0.0, 0.0 );
  281.     gluCylinder( quadric, 10.0, 0.0, 25.0, 16, 1 );
  282.     gluDisk( quadric, 0, 10.0, 16, 1 );
  283.   glPopMatrix();
  284.    
  285.   glPopMatrix();  
  286. */