【转】Glut处理鼠标事件
http://blog.csdn.net/wuyong2k/article/details/7839973
目錄(?)[-]
檢測鼠標單擊
要想在OpenGL中處理鼠標事件非常的方便,GLUT已經為我們的注冊好了函數,只要我們提供一個方法。使用函數glutMouseFunc,就可以幫我們注冊我們的函數,這樣當發生鼠標事件時就會自動調用我們的方法。
函數的原型是:
void glutMouseFunc(void(*func)(int button,int state,int x,int y)); 參數: func:處理鼠標click事件的函數的函數名。從上面可以看到,處理鼠標單擊事件的函數,一定有4個參數。第一個參數表明哪個鼠標鍵被按下或松開,這個變量可以是下面的三個值中的一個: GLUT_LEFT_BUTTON GLUT_MIDDLE_BUTTON GLUT_RIGHT_BUTTON
第二個參數表明,函數被調用發生時,鼠標的狀態,也就是是被按下,或松開,可能取值如下: GLUT_DOWN GLUT_UP
當函數被調用時,state的值是GLUT_DOWN,那么程序可能會假定將會有個GLUT_UP事件,甚至鼠標移動到窗口外面,也如此。然而,如果程序調用glutMouseFunc傳遞NULL作為參數,那么GLUT將不會改變鼠標的狀態。
剩下的兩個參數(x,y)提供了鼠標當前的窗口坐標(以左上角為原點)。
檢測動作
GLUT提供鼠標動作檢測能力。有兩種GLUT處理的motion:active motion和passive motion。Active motion是指鼠標移動并且有一個鼠標鍵被按下。Passive motion是指當鼠標移動時,并有沒鼠標鍵按下。如果一個程序正在追蹤鼠標,那么鼠標移動期間,每一幀將產生一個結果。
和以前一樣,你必須注冊將處理鼠標事件的函數(定義函數)。GLUT讓我們可以指定兩個不同的函數,一個追蹤passive motion,另一個追蹤active motion。
它們的函數原型如下:
void glutMotionFunc(void(*func)(int x,int y)); void glutPassiveMotionFunc(void (*func)(int x,int y)); 參數: Func:處理各自類型motion的函數名。處理motion的參數函數的參數(x,y)是鼠標在窗口的坐標。以左上角為原點。
檢測鼠標進入或離開窗口
GLUT還能檢測鼠標鼠標離開,進入窗口區域。一個回調函數可以被定義去處理這兩個事件。GLUT里,調用這個函數的是glutEntryFunc,函數原型如下:
void glutEntryFunc(void(*func)(int state)); 參數: Func:處理這些事件的函數名。上面函數的參數中,state有兩個值表明是離開還是進入窗口: GLUT_LEFT GLUT_ENTERED
應用
現在想實現的功能就是使用鼠標拖動,來轉動場景中的物體,當鼠標左鍵按下,并且上下左右滑動時,場景中的物體相應的會隨之上下左右旋轉,當鼠標右鍵按下,并且上下滑動時,場景中的物體相應的會隨之移入或是移出屏幕。
首先,定義幾個全局變量:
bool mouseLeftDown; bool mouseRightDown; float mouseX, mouseY; float cameraDistance; float cameraAngleX; float cameraAngleY;其中,mouseLeftDown和 mouseRightDown變量標志鼠標左右鍵按下與否,mouseX和mouseY變量標志鼠標滑動時,前一刻的鼠標所在位置,cameraDistance這個變量根據鼠標右鍵按下并上下滑動來控制場景中物體移入屏幕的遠近。cameraAngleX和cameraAngleY變量根據鼠標左鍵按下并滑動來控制場景中物體的旋轉。
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;}glutPostRedisplay(); }在主函數中,調用相應的函數注冊即可:
glutMouseFunc(mouseCB); glutMotionFunc(mouseMotionCB);在場景中物體繪制之前,這樣就可以:
glTranslatef(0, 0, cameraDistance); glRotatef(cameraAngleX, 1, 0, 0); glRotatef(cameraAngleY, 0, 1, 0); 參考: 鼠標事件處理轉載于:https://www.cnblogs.com/lzhitian/archive/2012/12/14/2818389.html
總結
以上是生活随笔為你收集整理的【转】Glut处理鼠标事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SCOM 2012 SP1---安装SC
- 下一篇: C#删除字符串最后一个字符的几种方法