#c #opengl #ubuntu #glut
#c #opengl #ubuntu #перенасыщение
Вопрос:
Я новичок в использовании 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 == %dn", 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 (amp;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
Дело в том, что я хочу скопировать этот код в другую программу на C , где я использую библиотеки OpenCV для подключения моей VGA-камеры. Основываясь на движениях, выполняемых перед камерой, я классифицирую выполняемые движения, используя модель SVM.
Я хочу использовать выходные данные модели SVM, которая в основном представляет собой целочисленное значение, и передать его в код OpenGL, чтобы переместить куб в окне.
В вышеупомянутом коде эта процедура выполняется с помощью нажатий клавиш и неявно glKeyboardFunc
функции. Какие функции я должен использовать, чтобы подключить выходные данные модели SVM к redraw
функции вышеупомянутого кода?
Комментарии:
1. Я не думаю, что вы можете сделать это легко, используя glut. Попробуйте использовать более продвинутый API или библиотеки GUI, такие как Qt или wxWidgets, для выполнения клавиатуры и пользовательской обработки событий.
Ответ №1:
Вы должны использовать glutIdle, чтобы проверить, есть ли новый фрейм. Если есть, вам следует обновить текстуры новым изображением, используя glTexSubImage2D *.
Для отображения пользовательского изображения следует использовать текстуру.