2011-11-10 5 views
1

私はopenGLを使用する初心者です。OpenGL - プログラムからのイベントとアフィン変換関数を接続する方法

私はインターネット上で見つかったプログラムを使用して、スクリーン上にキューブを描き、特定のキーボードストロークに従って翻訳、拡大縮小、回転を行いました。

ベローは、私がこれを行うためのコードを添付しました:

#define RADDEG 57.29577951f 

float XUP[3] = {1,0,0}, XUN[3] = {-1, 0, 0}, 
    YUP[3] = {0,1,0}, YUN[3] = { 0,-1, 0}, 
    ZUP[3] = {0,0,1}, ZUN[3] = { 0, 0,-1}, 
    ORG[3] = {0,0,0}; 

GLfloat viewangle = 0, tippangle = 0, traj[120][3]; 

GLfloat d[3] = {0.1, 0.1, 0.1}; 

GLfloat xAngle = 0.0, yAngle = 0.0, zAngle = 0.0; 

GLfloat scaleF = 0.2; 


//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

// Use arrow keys to rotate entire scene !!! 

void Special_Keys (int key, int x, int y) 
{ 
switch (key) { 

    case GLUT_KEY_LEFT : viewangle -= 5; break; 
    case GLUT_KEY_RIGHT: viewangle += 5; break; 
    case GLUT_KEY_UP : tippangle -= 5; break; 
    case GLUT_KEY_DOWN : tippangle += 5; break; 

    default: printf (" Special key %c == %d\n", key, key); 
} 

glutPostRedisplay(); 
} 

//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

void Keyboard (unsigned char key, int x, int y) 
{ 
switch (key) { 

    case 'j' : d[0] += 0.1; break; 
    case 'k' : d[0] -= 0.1; break; 
    case 'n' : d[1] += 0.1; break; 
    case 'm' : d[1] -= 0.1; break; 
    //case 'l' : d[2] += 0.1; break; 

    case 'z' : xAngle += 5; break; 
    case 'x' : yAngle += 5; break; 
    case 'c' : zAngle += 5; break; 

    case 'q' : scaleF += 0.1; break; 
    case 'w' : scaleF -= 0.1; break; 

    default: cout<< "Redo a valid keystroke;"<<endl; 
} 

glutPostRedisplay(); 
} 

//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

void Triad (void) 
{ 
glColor3f (1.0, 1.0, 1.0); 

glBegin (GL_LINES); 
    glVertex3fv (ORG); glVertex3fv (XUP); 
    glVertex3fv (ORG); glVertex3fv (YUP); 
    glVertex3fv (ORG); glVertex3fv (ZUP); 
glEnd(); 

glRasterPos3f (1.1, 0.0, 0.0); 
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, 'X'); 

glRasterPos3f (0.0, 1.1, 0.0); 
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, 'Y'); 

glRasterPos3f (0.0, 0.0, 1.1); 
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, 'Z'); 
} 

//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

void Draw_Box (void) 
{ 
glBegin (GL_QUADS); 

glColor3f(1,0,0); 
    glVertex3f(1,1,1); 
    glVertex3f(-1,1,1); 
    glVertex3f(-1,-1,1); 
    glVertex3f(1,-1,1); 

    glColor3f(0,1,1); 
    glVertex3f(1,1,-1); 
    glVertex3f(-1,1,-1); 
    glVertex3f(-1,-1,-1); 
    glVertex3f(1,-1,-1); 

    glColor3f(0,1,0); 
    glVertex3f(1,1,1); 
    glVertex3f(1,-1,1); 
    glVertex3f(1,-1,-1); 
    glVertex3f(1,1,-1); 

    glColor3f(1,0,1); 
    glVertex3f(-1,1,1); 
    glVertex3f(-1,-1,1); 
    glVertex3f(-1,-1,-1); 
    glVertex3f(-1,1,-1); 

    glColor3f(0,0,1); 
    glVertex3f(1,1,1); 
    glVertex3f(-1,1,1); 
    glVertex3f(-1,1,-1); 
    glVertex3f(1,1,-1); 

    glColor3f(1,1,0); 
    glVertex3f(1,-1,1); 
    glVertex3f(-1,-1,1); 
    glVertex3f(-1,-1,-1); 
    glVertex3f(1,-1,-1); 

glEnd(); 
} 

//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

void redraw (void) 
{ 
int v; 

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable (GL_DEPTH_TEST); 

glLoadIdentity(); 

glTranslatef (0, 0, -3); 
glRotatef (tippangle, 1,0,0); // Up and down arrow keys 'tip' view. 
glRotatef (viewangle, 0,1,0); // Right/left arrow keys 'turn' view. 

glDisable (GL_LIGHTING); 

Triad(); 

glPushMatrix(); 
    glTranslatef (d[0], d[1], d[2]); // Move box down X axis. 
    glScalef (scaleF, scaleF, scaleF); 
    glRotatef (zAngle, 0,0,1); 
    glRotatef (yAngle, 0,1,0); 
    glRotatef (xAngle, 1,0,0); 
    Draw_Box(); 
glPopMatrix(); 

glutSwapBuffers(); 
} 

//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

void wait (int seconds) 
{ 
    clock_t endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait) {} 
} 

int main (int argc, char **argv) 
{ 
glutInit    (&argc, argv); 
glutInitWindowSize  (900, 600); 
glutInitWindowPosition (300, 300); 
glutInitDisplayMode (GLUT_DEPTH | GLUT_DOUBLE); 

glutCreateWindow ("Orbital Font Demo"); 
glutDisplayFunc ( redraw ); 
glutKeyboardFunc ( Keyboard ); 
//glutSpecialFunc (Special_Keys); 



glClearColor (0.1, 0.0, 0.1, 1.0); 

glMatrixMode (GL_PROJECTION); 
gluPerspective (60, 1.5, 1, 10); 
glMatrixMode (GL_MODELVIEW); 
glutPostRedisplay(); 

glutMainLoop (); 



return 1; 
} 

//---+----3----+----2----+----1----+---<>---+----1----+----2----+----3----+----4 

事は、私は私のVGAカメラを接続するためのOpenCVのライブラリを使用しています別のC++のプログラムにこのコードをコピーしたいということです。カメラの前で行われた動きに基づいて、SVMモデルを使って実行された動きを分類します。 基本的に整数値であるSVMモデルの出力を使用して、ウィンドウ内のキューブを移動するためにOpenGLコードに渡したいとします。

上記のコードでは、この手順はキーストロークを使用して実行され、暗黙的にglKeyboardFunc機能が実行されます。上記のコードの関数redrawにSVMモデルの出力を接続するためにどのような関数を使用する必要がありますか?

+0

私はあなたがglutを使用してこれを簡単に行うことはできないと思います。 QtやWxWidgetsなどのより高度なAPIやGUIライブラリを使用して、キーボードとカスタムイベント処理を実行してみてください。 – ksming

答えて

1

glutIdleを使用して、新しいフレームがあるかどうかを確認する必要があります。 glTexSubImage2D *を使用して新しいイメージでテクスチャを更新する必要がある場合。

* カスタムイメージを表示するには、テクスチャを使用する必要があります。

関連する問題