【raviramamoorthi-Computer Graphics】OpenGL1:Window System & Callbacks

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,在下一个显示回调只产生单一的重新显示回调。


glutMotionFunc(mousedrag)

其中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();
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值