个人认为,第三章分两个部分,第一部分介绍了一些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
如果我需要,那么你进入我的田地,或者离开我的田地,都要跟我打报告