OpenGL 鍵盤控制

2022-04-28 01:29:12 字數 3590 閱讀 5554

** 

glut允許我們編寫程式,在裡面加入鍵盤輸入控制,包括了普通鍵,和其他特殊鍵(如f1,up)。在這一章裡我們將學習如何去檢測哪個鍵被按下,可以從glut裡得到些什麼資訊,和如何處理鍵盤輸入。 

處理按鍵訊息,我們必須使用glut通知視窗系統,當某個鍵被按下時,哪個函式將完成所要求的操作。我們同樣是呼叫乙個函式註冊相關的**函式。 

當你按下乙個鍵後,glut提供了兩個函式為這個鍵盤訊息註冊**。第乙個是glutkeyboardfunc。這個函式是告訴視窗系統,哪乙個函式將會被呼叫來處理普通按鍵訊息。 普通鍵是指字母,數字,和其他可以用ascii**表示的鍵。函式原型如下: 

void glutkeyboardfunc(void(*func)(unsigned char key,int x,int y)); 

引數: 

func: 處理普通按鍵訊息的函式的名稱。如果傳遞null,則表示glut忽略普通按鍵訊息。 

這個作為glutkeyboardfunc函式引數的函式需要有三個形參。第乙個表示按下的鍵的ascii碼,其餘兩個提供了,當鍵按下時當前的滑鼠位置。滑鼠位置是相對於當前客戶視窗的左上角而言的。 

乙個經常的用法是當按下escape鍵時退出應用程式。注意,我們提到過,glutmainloop函式產生的是乙個永無止境的迴圈。唯一的跳出迴圈的方法就是呼叫系統exit函式。這就是我們函式要做的,當按下escape鍵呼叫exit函式終止應用程式(同時要記住在源**包含標頭檔案stdlib.h)。下面就是這個函式的**: 

void processnormalkeys(unsigned char key,int x,int y) 

下面讓我們控制特殊鍵的按鍵訊息。glut提供函式glutspecialfunc以便當有特殊鍵按下的訊息時,你能註冊你的函式。函式原型如下: 

void glutspecialfunc(void (*func)(int key,int x,int y)); 

引數: 

func: 處理特殊鍵按下訊息的函式的名稱。傳遞null則表示glut忽略特殊鍵訊息。

下面我們寫乙個函式,當一些特殊鍵按下的時候,改變我們的三角形的顏色。這個函式使在按下f1鍵時三角形為紅色,按下f2鍵時為綠色,按下f3鍵時為藍色。 

void processspecialkeys(int key, int x, int y)  

} 上面的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,表明三角形最開始是白色的。 

float red=1.0, blue=1.0, green=1.0; 

void renderscene(void)  

下面我們就該告訴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。**如下: 

void processnormalkeys(unsigned char key, int x, int y)  

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

void processspecialkeys(int key, int x, int y)  

break; 

case glut_key_f2 :  

red = 0.0;  

green = 1.0;  

blue = 0.0; break; 

case glut_key_f3 :  

red = 0.0;  

green = 0.0;  

blue = 1.0; break; } }

OpenGL鍵盤操作和動畫

前面三篇文章已經把opengl的程式設計基本結構描述完畢。以後會在這個基礎上逐漸深化,不斷增添新內容。這一篇是講述 鍵盤操作和動畫基礎 實際還差的遠哪 只是個簡單的能由使用者控制的動畫,讓物體前後移動,左右旋轉。是我們自 己的第乙個quake!當然這個版本誰買誰上當,呵呵。這篇的另乙個目的就是加深前...

鍵盤控制移動

pathgo 導航模組的預設固定 ip 是 192.168.31.200 預設使用者名為eaibot 預設密碼為 eaibot 開啟乙個終端,執行以下命令,啟動底盤驅動 帶平滑加減速 ssh eaibot 192.168.31.200 roslaunch dashgo driver demo.lau...

iPhone控制鍵盤

有時候當鍵盤彈出時會把輸入框蓋住,這時候我們就沒法看到自己到底輸入的是什麼了,這時候我們就需要註冊兩個事件,那就是在鍵盤顯示的時候 把輸入框的位置放在可見的地方 當關閉鍵盤時,在將輸入框還原,以下就是解決問題的具體方法,我們只要註冊就可以了 call this method somewhere in...