OpenGL鍵盤交互響應事件


GLUT允許我們編寫程序,在里面加入鍵盤輸入控制,包括了普通鍵,和其他特殊鍵(如F1,UP)。在這一章里我們將學習如何去檢測哪個鍵被按下,可以從GLUT里得到些什么信息,和如何處理鍵盤輸入。 
  
處理按鍵消息,我們必須使用GLUT通知窗口系統,當某個鍵被按下時,哪個函數將完成所要求的操作。我們同樣是調用一個函數注冊相關的回調函數。 
  
當你按下一個鍵后,GLUT提供了兩個函數為這個鍵盤消息注冊回調。第一個是glutKeyboardFunc。這個函數是告訴窗口系統,哪一個函數將會被調用來處理普通按鍵消息。 普通鍵是指字母,數字,和其他可以用ASCII代碼表示的鍵。函數原型如下: 
procedure  glutKeyboardFunc(void(*func)(key:char;x,y:longint)); 
參數: 
func: 處理普通按鍵消息的函數的名稱。如果傳遞NULL,則表示GLUT忽略普通按鍵消息。 
這個作為glutKeyboardFunc函數參數的函數需要有三個形參。第一個表示按下的鍵的ASCII碼,其余兩個提供了,當鍵按下時當前的鼠標位置。鼠標位置是相對於當前客戶窗口的左上角而言的。 
  

一個經常的用法是當按下ESCAPE鍵時退出應用程序。注意,我們提到過,glutMainLoop函數產生的是一個永無止境的循環。唯一的跳出循環的方法就是調用系統exit函數。這就是我們函數要做的,當按下ESCAPE鍵調用exit函數終止應用程序(同時要記住在源代碼包含頭文件stdlib.h)。下面就是這個函數的代碼: 
procedure processNormalKeys(key:char;x,y:longint) ;cdecl;
begin
      if key=27 then 
            Exit(0); 
end;
  

下面讓我們控制特殊鍵的按鍵消息。GLUT提供函數glutSpecialFunc以便當有特殊鍵按下的消息時,你能注冊你的函數。函數原型如下: 
procedure glutSpecialFunc(void (*func)(key,x,y:longint)); 
參數: 
func: 處理特殊鍵按下消息的函數的名稱。傳遞NULL則表示GLUT忽略特殊鍵消息。 
  
下面我們寫一個函數,當一些特殊鍵按下的時候,改變我們的三角形的顏色。這個函數使在按下F1鍵時三角形為紅色,按下F2鍵時為綠色,按下F3鍵時為藍色。 

procedure processSpecialKeys(key:char;x,y:longint) ;cdecl;

begin 
         case key of
                 GLUT_KEY_F1 :  

                               begin
                                   red = 1.0;  
                                   green = 0.0;  
                                   blue = 0.0;

                                end;
                 GLUT_KEY_F2 :

                                 begin  

                                   red = 0.0;  
                                   green = 1.0;  
                                   blue = 0.0;

                                 end;
                 GLUT_KEY_F3 :  

                                 begin
                                   red = 0.0;  
                                   green = 0.0;  
                                   blue = 1.0;

                                 end;
         end;
end;

 

 

 

 

上面的GLUT_KEY_*在glut.h里已經被預定義為常量。這組常量如下: 

GLUT_KEY_F1               F1 function key 
GLUT_KEY_F2               F2 function key 
GLUT_KEY_F3               F3 function key 
GLUT_KEY_F4               F4 function key 
GLUT_KEY_F5               F5 function key 
GLUT_KEY_F6               F6 function key 
GLUT_KEY_F7               F7 function key 
GLUT_KEY_F8               F8 function key 
GLUT_KEY_F9               F9 function key 
GLUT_KEY_F10              F10 function key 
GLUT_KEY_F11              F11 function key 
GLUT_KEY_F12              F12 function key 
GLUT_KEY_LEFT             Left function key 
GLUT_KEY_RIGHT            Up function key 
GLUT_KEY_UP               Right function key 
GLUT_KEY_DOWN             Down function key 
GLUT_KEY_PAGE_UP          Page Up function key 
GLUT_KEY_PAGE_DOWN        Page Down function key 
GLUT_KEY_HOME             Home function key 
GLUT_KEY_END              End function key 
GLUT_KEY_INSERT           Insert function key 

 

 


為了讓上面processSpecialKeys函數能過編譯通過,我們還必須定義,red,green,blue三個變量。此外為了得到我們想要的結果,我們還必須修改renderScene函數。 

... 
// 所有的變量被初始化為1,表明三角形最開始是白色的。 
red:=1.0; blue:=1.0; green:=1.0; 
procedure  renderScene ;cdecl;

begin
         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
         glPushMatrix(); 
         glRotatef(angle,0.0,1.0,0.0); 
  
         // glColor3f設置繪制三角形的顏色。 
         glColor3f(red,green,blue); 
  
         glBegin(GL_TRIANGLES); 
                 glVertex3f(-0.5,-0.5,0.0); 
                 glVertex3f(0.5,0.0,0.0); 
                 glVertex3f(0.0,0.5,0.0); 
         glEnd(); 
         glPopMatrix(); 
         angle:=angle+1; 
         glutSwapBuffers(); 
end;

 

 

 

下面我們就該告訴GLUT,我們剛剛定義的函數用來處理,按鍵消息。也就是該調用glutKeyboardFunc和glutSpecialFunc函數。我們在main函數里調用它們。   
CTRL,ALT和SHIFT 
  
一些時候我們想知道要是一個組合鍵(modifier key)也就是CTRL,ALT或者SHIFT被按下該如何處理。GLUT提供了一個函數來檢測是否有組合鍵被按下。這個函數僅僅只能在處理按鍵消息或者鼠標消息函數里被調用。函數原型如下: 
int glutGetModifiers(void); 
這個函數的返回值是三個glut.h里預定義的常量里的一個,或它們的或組合。這三個常量是: 
1:GLUT_ACTIVE_SHIFT: 返回它,當按下SHIFT鍵或按下CAPS LOCK,注意兩者同時按下時,不會返回這個值。 
2:GLUT_ACTIVE_CTRL: 返回它,當按下CTRL鍵。 
3:GLUT_ACTIVE_ATL:返回它,當按下ATL鍵。 
注意,窗口系統可能會截取一些組合鍵(modifiers),這是就沒有回調發生。現在讓我們擴充processNormalKeys,處理組合鍵。按下r鍵時red變量被設置為0.0,當按下ATL+r時red被設置為1.0。代碼如下: 

procedure processNormalKeys(key:char;x,y:longint) ;cdecl;
  begin
         if key = 27  then
                 exit(0); 
         else if key='r' then

                begin 
                 mod := glutGetModifiers(); 
                 if mod = GLUT_ACTIVE_ALT then
                          red := 0.0; 
                 else 
                          red := 1.0; 
         end;
end;

 

 

 

注意如果我們按下R鍵,將不會有什么發生,因為R與r鍵的ASCII碼不同。即這是兩個不同的鍵。最后就是如何檢測按鍵CTRL+ALT+F1?。這種情況下,我們必須同時檢測兩個組合鍵,為了完成操作我們需要使用或操作符。下面的代碼段,使你按下CTRL+ALT+F1時顏色改變為紅色。 

 

procedure PressSpecialKeys(key,x,y:longint);cdecl;
var
 mod:longint;
begin
 case key of
  GLUT_KEY_F1:begin
               mod:=glutGetModifiers;
               if mod=(GLUT_ACTIVE_CTRL or GLUT_ACTIVE_ALT) then
                begin
                 red:=1;
                 green:=0;
                 blue:=0;
                end;
              end;
  GLUT_KEY_F2:begin red:=0; green:=1; blue:=0; end;
  GLUT_KEY_F3:begin
               red:=0;
               green:=0;
               blue:=1;
              end;
 end; 
end;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM