2011-12-25 71 views
2

我编写了下面的代码,但是在运行时,当我按下按键时,程序不起作用。
我想编写一个程序,当用户按下right_keyalt_key时绘制一个三角形。但这根本不起作用。它总是显示一个黑屏。如何编写GLUT键盘功能?

#include <GL/glut.h> 
void init (void) 
{ 
    glClearColor(0.0,0.0,0.0,0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,200.0,0.0,200.0); 
} 
float red=1,green=1,blue=1; 
void processSpecialKeys(int key, int x, int y) { 
    if(key=='0') 
     exit(0); 
    int mod; 
    if(key== GLUT_KEY_RIGHT) { 
     mod = glutGetModifiers(); 
     if (mod==GLUT_ACTIVE_ALT) { 
      red = 1.0; green = 0.0; blue = 0.0; 
      glColor3f(red,green,blue); 
      glBegin(GL_TRIANGLES); 
      glVertex2f(0,0); 
      glVertex2f(0,100); 
      glVertex2f(50,100); 
      glEnd(); 
     } 
    } 
} 
void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glFlush(); 
} 
int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(50,20); 
    glutInitWindowSize(400, 300); 
    glutCreateWindow("A simple example"); 
    init(); 
    glutDisplayFunc(display); 
    glutSpecialFunc(processSpecialKeys); 
    glutMainLoop(); 
} 
+0

OpenGL不做任何keayboard处理。你可能意思是GLUT,它与OpenGL没有任何关系。 – 2011-12-25 15:39:56

回答

6

现在就行。我修改了您的代码以启用ALT或SHIFT或CTRL。该代码打印出键的扫描码。 要打印ALT,CTRL或SHIFT扫描码,只需按ALT或SHIFT或CTRL并结合其他键。 其他GLUT不会注册它。

#include <stdio.h> 
#include <GL/glut.h> 

float red=1,green=1,blue=1; 



void init (void) 
{ 
    glClearColor(0.0,0.0,0.0,0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,200.0,0.0,200.0); 
} 


void process_SHIFT_ALT_CTRL(unsigned char key, int x, int y) 
{ 
    // Press ALT or SHIFT or CTRL in combination with other keys. 
    printf("key_code =%d \n",key); 

    int mod = glutGetModifiers(); 

    if (mod != 0) //ALT=4 SHIFT=1 CTRL=2 
    {  
      switch(mod) 
      { 
      case 1 : printf("SHIFT key %d\n",mod); break; 
      case 2 : printf("CTRL key %d\n",mod); break; 
      case 4 : printf("ALT key %d\n",mod); break; 
      mod=0; 
      } 
    } 
} 


void process_Normal_Keys(int key, int x, int y) 
{ 
    switch (key) 
    {  
     case 27 :  break; 
     case 100 : printf("GLUT_KEY_LEFT %d\n",key); break; 
     case 102: printf("GLUT_KEY_RIGHT %d\n",key); ; break; 
     case 101 : printf("GLUT_KEY_UP %d\n",key); ; break; 
     case 103 : printf("GLUT_KEY_DOWN %d\n",key); ; break; 
    } 

} 


void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glFlush(); 
} 


int main(int argc, char **argv) 
{ 

    printf("Press ALT or SHIFT or CTRL in combination with other keys. \n\n"); 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(800,20); 
    glutInitWindowSize(400, 300); 
    glutCreateWindow("A simple example"); 
    init(); 

    // famous GLUT callback functions 

    glutDisplayFunc(display); 


    glutSpecialFunc(process_Normal_Keys); 
    glutKeyboardFunc(process_SHIFT_ALT_CTRL); 


    glutMainLoop(); 

return 0; 
} 
+0

感谢代码... – 2011-12-25 14:35:18

+0

'glutSpecialFunc(process_Normal_Keys);',真的吗? – wmamrak 2015-01-09 17:27:13

3

这不会以这种方式工作,因为对键盘回调的调用将异步运行。

这意味着,除非击键正好在glClear()glFlush()之间进行处理,否则您将看不到一个三角形,这种情况很少会发生,并且只会出现在一个单帧中。

您需要做的事情非常简单: 在处理按键时,请保存该状态,例如,根据键输入将布尔变量设置为true/false。

然后检查display()中的内容,并绘制三角形(如果需要)。

伪代码示例:

bool status = false; 

inputhandler(key) 
{ 
    if(key == KEY_A) 
     status = true 
    else if(KEY == KEY_S) 
     status = false; 
} 

displayhandler() 
{ 
    clear(); 
    if(status) 
     drawTriangle(); 
    flush(); 
} 

main() 
{ 
    //... init etc. 
    glutDisplayFunc(&displayhandler); 
    glutSpecialFunc(&inputhandler); 
} 

在进一步指出,如果你想进入的OpenGL编程,而不必担心处理周围其他的东西,我会建议使用预制库处理窗口,输入等等,例如SFMLSDL。它们的工作方式与glut相似,但通常它们更强大,并且仍然允许您直接运行OpenGL调用,同时提供简化的事件处理。

+0

你能解释更多吗? – 2011-12-25 10:24:34

+0

我可以调用glutSpecialFunc(processSpecialKeys)func。在显示功能? – 2011-12-25 10:25:27

+0

*显示回调正在运行时,键盘回调不会*运行*。如果确实如此,则需要同步对共享状态的访问。 – 2011-12-25 10:28:09

1

您无法在键盘回调中生成图形命令。当您感兴趣的按键被按下时,设置一些全局状态,并使用显示代码中的信息。

调试这样的问题的方法是在您认为不工作的代码中使用printf语句。这里在键盘处理程序中添加一个printf会很快告诉你代码正在执行,但三角形没有被绘制。这可能会导致您考虑图形命令何时可能以及何时不可用。