個人認爲,第三章分兩個部分,第一部分介紹了一些glut工具。第二部分介紹了OpenGL的工作方式。
首先,glut的工具:
1 重繪回調函數
void glutReshapeFunc(void (*newShape)(int width, int height))
當窗口的尺寸改變事,會執行方法newShape。newShape的參數分別是窗口的寬度和高度。newShape可以由程序員自定義實現、替換。
在main函數中通過 glutReshapeFunc(newShape);語句來註冊newShape函數,這樣,在改變窗口尺寸後,newShape將被執行。
打個比方,我們申明瞭一個函數叫 plant_a_Watermelon_as_window(int width, int height) { /*種個跟窗口一樣大個瓜 :D */ }
然後在main函數中用glutReshapeFunc註冊:glutReshapeFunc(plant_a_Watermelon_as_window).
這樣,當改變窗口大小時,窗口的地裏總是有個跟窗口一樣大的瓜。
2 Idel回調函數
void glutIdleFunc(void (*myIdle(void))
當事件隊列爲空時。函數muIdle將被執行。簡單的理解,當窗口就那麼擺到屏幕上,不去理他,不按鍵盤也不動鼠標,就看着它。那麼這個myIdle將被執行。
在main函數中通過 glutIdleFunc(myIdle);語句來註冊myIdle函數,這樣,在恰當時間,myIdle將被執行。
3 鍵盤,鼠標,
void glutKeyboardFunc(void (*f)(unsigned char key, int x, int y))
當按下按鍵時,執行f函數。x,y是按下按鍵時鼠標的座標
void glutSpecialFunc(void (*f)(int key, int x, int y))
當按下特殊按鍵時,執行f函數,特殊按鍵包括F1,方向鍵等等,key即按下的按鍵值(例如GLUT_KEY_F1, GLUT_KEY_UP等等)。x,y是按下按鍵時鼠標的座標
int glutGetModifiers()
判斷按鍵組合試試用:例如Ctrl+c這麼表示:
if(glutGetModifiers()==GLUT_ACTIVE_CTRL && key =='c'){ /* copy*/ }
void glutMouseFunc(void (*f)(int button, int state, int x, int y))
當鼠標被按鍵被點擊時,執行f函數。botton取值GLUT_RIGHT_BUTTON等,state取值GLUT_DOWN、GLUT_UP。
void glutMotionFunc(void (*f)(int x, int y))
當鼠標按鍵被按下並且移動時,執行f函數
void glutPassiveMotionFunc(void (*f)(int x, inty))
當鼠標按鍵沒有按下僅僅移動時,執行f函數
void glutEntryFunc(void (*f)(int state))
當鼠標進入或者離開窗口時,執行f函數。state的值可能是GLUT_ENTERED或者GLUT_LEFT
如果我需要,那麼你進入我的田地,或者離開我的田地,都要跟我打報告