① Window System Interaction不属于OpenGL的一部分,但是有GLUT库提供一些回调函数,用于支持一些事件。
② 在上一节课中main函数中有一部分代码没有写上:(注释掉的)
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(mousedrag);
函数学习:
glutDisplayFunc(display):
用于注册一个绘图函数,这样操作系统在必要时刻就会对窗体进行重新绘制操作。具体来说,就是设置一个display(void)函数,当需要进行画图时就调用这个函数。
glutReshapeFunc(reshape):
功能还想打个问号……到时候自己试吧 :)
其中reshape函数需要自己定义:
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0,(GLdouble)w/(GLdouble)h,1.0,10.0);
}
函数学习(哈哈 嵌套了):
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)
默认情况下,viewport被设置为占据打开窗口的整个像素矩形,窗口大小和设置视口大小相同;如果想要自己设置,比如对窗口区域进行划分,在同一窗口中显示更小的图啦,分割屏幕什么的,就可以用这个函数。
参数:x,y以像素为单位,指定了viewport的左下角。
width,height表示这个viewport的宽度和高度。
然后之后开始设置投影啦!(在上一节课设置的是物体,gluLookAt)
gluPerspective(
GLdouble fovy, //角度
GLdouble aspect, //视景体的宽高比
GLdouble zNear, //沿z轴方向的两裁面之间的距离的近处
GLdouble zFar //。。的远处
)
glutKeyboardFunc(keyboard)
其中keyboard函数需要自己定义:
void keyboard(unsigned char key, int x,int y)
{
switch(key)
{
case 27:
exit(0);
break;
default:
break;
}
}
glutMouseFunc(mouse)
其中mouse函数需要自己定义:
void mouse(int button,int state,int x,int y)
{
if(button == GLUT_LEFT_BUTTON)
{
if(state == GLUT_UP);//Do nothing
else if(state == GLUT_DOWN) //测试了一下,好像并没有发生什么。。不太清楚,之后再说吧
mouseoldx = x; mouseoldy = y;
}
else if(button == GLUT_RIGHT_BUTTON && STATE == GLUT_DOWN)//右键复位(将MODEL复位)
{
eyeloc = 2.0;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,-eyeloc,eyeloc,0,0,0,0,1,1);
glutPostRedisplay();
}
}
函数学习(又嵌套啦!)
glutPostRedisplay(void):
标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调。
其中mousedrag函数需要自己定义:
void mousedrag(int x,int y)
{
int yloc = y-mouseoldy; //We will use the y coord to zoom in/out
eyeloc += 0.005*yloc;//Where do we look from
if(eyeloc < 0) eyeloc = 0.0;
mouseoldy = y;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,-eyeloc,eyeloc,0,0,0,0,1,1);
glutPostRedisplay();
}