日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Glut处理鼠标事件:函数glutMouseFunc

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Glut处理鼠标事件:函数glutMouseFunc 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

檢測鼠標單擊

要想在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); 參考: 鼠標事件處理 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Glut处理鼠标事件:函数glutMouseFunc的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。