Glut处理鼠标事件:函数glutMouseFunc
檢測鼠標單擊
要想在OpenGL中處理鼠標事件非常的方便,GLUT已經(jīng)為我們的注冊好了函數(shù),只要我們提供一個方法。使用函數(shù)glutMouseFunc,就可以幫我們注冊我們的函數(shù),這樣當(dāng)發(fā)生鼠標事件時就會自動調(diào)用我們的方法。
函數(shù)的原型是:
void glutMouseFunc(void(*func)(int button,int state,int x,int y)); 參數(shù): func:處理鼠標click事件的函數(shù)的函數(shù)名。 從上面可以看到,處理鼠標單擊事件的函數(shù),一定有4個參數(shù)。第一個參數(shù)表明哪個鼠標鍵被按下或松開,這個變量可以是下面的三個值中的一個:
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
第二個參數(shù)表明,函數(shù)被調(diào)用發(fā)生時,鼠標的狀態(tài),也就是是被按下,或松開,可能取值如下:
GLUT_DOWN
GLUT_UP
當(dāng)函數(shù)被調(diào)用時,state的值是GLUT_DOWN,那么程序可能會假定將會有個GLUT_UP事件,甚至鼠標移動到窗口外面,也如此。然而,如果程序調(diào)用glutMouseFunc傳遞NULL作為參數(shù),那么GLUT將不會改變鼠標的狀態(tài)。
剩下的兩個參數(shù)(x,y)提供了鼠標在當(dāng)前窗口中的坐標(以左上角為原點)。
檢測動作
GLUT提供鼠標動作檢測能力。有兩種GLUT處理的motion:active motion和passive motion。Active motion是指鼠標移動并且有一個鼠標鍵被按下。Passive motion是指當(dāng)鼠標移動時,并有沒鼠標鍵按下。如果一個程序正在追蹤鼠標,那么鼠標移動期間,每一幀將產(chǎn)生一個結(jié)果。
和以前一樣,你必須注冊將處理鼠標事件的函數(shù)(定義函數(shù))。GLUT讓我們可以指定兩個不同的函數(shù),一個追蹤passive motion,另一個追蹤active motion。
它們的函數(shù)原型如下:
void glutMotionFunc(void(*func)(int x,int y)); void glutPassiveMotionFunc(void (*func)(int x,int y)); 參數(shù): Func:處理各自類型motion的函數(shù)名。處理motion的參數(shù)函數(shù)的參數(shù)(x,y)是鼠標在窗口的坐標。以左上角為原點。
檢測鼠標進入或離開窗口
GLUT還能檢測鼠標鼠標離開,進入窗口區(qū)域。一個回調(diào)函數(shù)可以被定義去處理這兩個事件。GLUT里,調(diào)用這個函數(shù)的是glutEntryFunc,函數(shù)原型如下:
void glutEntryFunc(void(*func)(int state)); 參數(shù): Func:處理這些事件的函數(shù)名。 上面函數(shù)的參數(shù)中,state有兩個值表明是離開還是進入窗口:
GLUT_LEFT
GLUT_ENTERED
應(yīng)用
現(xiàn)在想實現(xiàn)的功能就是使用鼠標拖動,來轉(zhuǎn)動場景中的物體,當(dāng)鼠標左鍵按下,并且上下左右滑動時,場景中的物體相應(yīng)的會隨之上下左右旋轉(zhuǎn),當(dāng)鼠標右鍵按下,并且上下滑動時,場景中的物體相應(yīng)的會隨之移入或是移出屏幕。
首先,定義幾個全局變量:
bool mouseLeftDown; bool mouseRightDown; float mouseX, mouseY; float cameraDistance; float cameraAngleX; float cameraAngleY;其中,mouseLeftDown和?mouseRightDown變量標志鼠標左右鍵按下與否,mouseX和mouseY變量標志鼠標滑動時,前一刻的鼠標所在位置,cameraDistance這個變量根據(jù)鼠標右鍵按下并上下滑動來控制場景中物體移入屏幕的遠近。cameraAngleX和cameraAngleY變量根據(jù)鼠標左鍵按下并滑動來控制場景中物體的旋轉(zhuǎn)。
void mouseCB(int button, int state, int x, int y) {mouseX = x;mouseY = y; if(button == GLUT_LEFT_BUTTON) {if(state == GLUT_DOWN){mouseLeftDown = true;}else if(state == GLUT_UP)mouseLeftDown = false; }else if(button == GLUT_RIGHT_BUTTON) {if(state == GLUT_DOWN){mouseRightDown = true;}else if(state == GLUT_UP)mouseRightDown = false; }}
void mouseMotionCB(int x, int y)
{
if(mouseLeftDown)
{
cameraAngleY += (x - mouseX);
cameraAngleX += (y - mouseY);
mouseX = x;
mouseY = y;
}
if(mouseRightDown)
{
cameraDistance += (y - mouseY) * 0.2f;
mouseY = y;
}
}
在主函數(shù)中,調(diào)用相應(yīng)的函數(shù)注冊即可:
glutMouseFunc(mouseCB); glutMotionFunc(mouseMotionCB);在場景中物體繪制之前,這樣就可以:
glTranslatef(0, 0, cameraDistance); glRotatef(cameraAngleX, 1, 0, 0); glRotatef(cameraAngleY, 0, 1, 0); 參考: 鼠標事件處理 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Glut处理鼠标事件:函数glutMouseFunc的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编实验1遇到的问题及解决之记录(以及尚
- 下一篇: 工具使用 - Quartus II 管脚