您的位置:首页 > 其它

GLUT常用函数介绍

2011-04-28 15:54 204 查看
对象:GLUT的入门级(初学者)

关键字:GLUT、函数
核心内容:主要是通过在一个具体的程序中函数的作用
平台:visual studio2008,需要配置好OpenGL32.lib、GLu32.lib、GlAux.Lib、glut32.lib和相应的dll文件。
正文

1 示例

简单的一个主函数:
#include <windows.h>
#include <GL/glut.h>
#include <gl/glaux.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/************************************************************************/
/* 主函数 */
/************************************************************************/
int main(int argc,char** argv)
{
/******************* 初始化窗口**************************************/
//初始化glut库,如果失败,程序退出
glutInit(&argc,argv);
//初始化显示模式,这里声明采用双缓存并采用RGB的颜色模式
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
//初始化窗口的位置,以左上角为原点、向左为x轴正方向,向下为y轴方向
glutInitWindowPosition(50,100);
//创建一个大小为*640(像素)的窗口
glutInitWindowSize(640,640);
//创建一个窗口,并设定窗口的标题为“An Example of OpenGL Program”
glutCreateWindow("An Example of OpenGL Program");

//用于初始化的一个函数,主要是对opengl中的一些参数进行设定
init();

/*********************设定响应函数********************************/
//设定键盘响应函数
glutKeyboardFunc(pressKeyboard);
//设定特殊的键盘响应函数
glutSpecialFunc(specialKey);
//设定鼠标点击响应函数
glutMouseFunc(pickTarget);
//设定鼠标移动响应函数
glutMotionFunc(mouseMotion);
//显示输出函数。主要是opengl的绘制
glutDisplayFunc(display);
//调整窗口大小变化时的响应函数
glutReshapeFunc(reshape);

/*********************循环等待********************************/
//进入循环,等待输入,触发相应的响应
glutMainLoop();
return 0;
}
以上主函数里包含了常用的glut中的函数。其中,glutInit(),glutInitWindowPosition(),glutInitWindowSize(),glutCreateWindow()等函数比较简单,程序中的介绍已经足够。下面重点介绍其它函数。

2 glutInitDisplayMode()

初始化显示模式。这里主要采用RGB模式显示,并采用双缓存模式。双缓存模式相对的是单缓存,双缓存是现在后台缓存绘制,在绘制完成后,将后台与前台缓存交换,后台变前台,前台变后台,达到快速输出的效果。而单缓存,在绘制时就在唯一缓存中绘制,当绘制时间比较长时,会使屏幕比较卡。

3 glutKeyBoardFunc(pressKeyboard)

设定键盘响应函数为pressKeyboard,函数的结构为:
/************************************************************************/
/* 按键响应 */
/************************************************************************/
void pressKeyboard(unsigned char key, int x,int y){
switch(key){
case 'r'://按键'r',经角度增加度。
spin = (spin+30)%360;
break;
case 't'://按键't',修改textureNum的值
//采用组合键Alt
if (glutGetModifiers()==GLUT_ACTIVE_ALT)
{
textureNum+=2;
if (textureNum>=6)
{
textureNum=0;
}
break;
}
else{
textureNum-=2;
if (textureNum<0)
{
textureNum=4;
}
break;
}
default:
break;
}
//刷新屏幕
glutPostRedisplay();
}
其中,key为返回的按键的ASCII编码,x和y为鼠标的当前的位置。

对于组合键,可以通过glutGetModifiers(),获取按下当前的组合键,返回值如下:

意义
GLUT_ACTIVE_ALT
Alt被按下
GLUT_ACTIVE_CTRL
Ctrl被按下
GLUT_ACTIVE_SHIFT
Shift或Caps Lock被按下
注意:对于组合键,glut不支持多个组合键。如Ctrl+Alt+t并不会响应

4 glutSpecialFunc(specialKey)

实际也是针对按键响应,但与glutKeyBoardFunc相比,前者针对的是一些特殊的按键。包括:
GLUT_KEY_F1,GLUT_KEY_F2,GLUT_KEY_F3,GLUT_KEY_F4,GLUT_KEY_F5,GLUT_KEY_F6,GLUT_KEY_F7,
GLUT_KEY_F8,GLUT_KEY_F9,GLUT_KEY_F10,GLUT_KEY_F11,GLUT_KEY_F12,GLUT_KEY_LEFT,
GLUT_KEY_UP,GLUT_KEY_RIGHT,GLUT_KEY_DOWN,GLUT_KEY_PAGE_UP,GLUT_KEY_PAGE_DOWN,
GLUT_KEY_HOME,GLUT_KEY_END,GLUT_KEY_INSERT。函数结构与glutKeyBoardFunc相同。

5 glutMouseFunc(pickTarget)

鼠标点击响应。pickTarget函数结构如下:
/************************************************************************/
/* 鼠标点击,选择物体 */
/************************************************************************/
void pickTarget(int button, int state,int x,int y)
{
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
{
//左键单击响应
}
else
{
}
break;
case GLUT_RIGHT_BUTTON:
break;
default:
break
}
glutPostRedisplay();
}
参数意义如下:
参数
意义
x,y
鼠标的屏幕位置
button
GLUT_LEFT_BUTTON鼠标左键
GLUT_RIGHT_BUTTON鼠标右键
GLUT_MIDDLE_BUTTON鼠标的滚轮键
state
GLUT_DOWN鼠标键按下
GLUT_UP鼠标键抬起

6 glutMotionFunc(mouseMotion)

按住鼠标移动。mouseMotion的函数结构如下:void mouseMotion(int x,int y){}。xy为鼠标的屏幕坐标。
在鼠标拖动过程中,与前一刻的鼠标坐标相比较,就可以比较快得到鼠标的运动情况(如鼠标的运动方向)

7 glutDisplayFunc(display)

display主要是显示输出函数,需要与opengl结合,这里不仔细讲,可以参看opengl的一些绘制函数示例。这里给出一个示例,结构如下:
/************************************************************************/
/* 输出显示 */
/************************************************************************/
void display(void)
{
//将缓存清空,以便绘制新的图像,类似清屏操作
glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//修改为模型矩阵,并将
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//绘制物体
drawTargets(GL_RENDER);
//利用双缓存,执行绘制
glutSwapBuffers();
}

8 glutReshapeFunc(reshape)

对于窗口调整时,需要进行的操作。通常在opengl里,需要进行一些投影变换和视口变换。这里对于具体什么事投影变换和视口变换不介绍,可以查看《opengl编程指南》这本书。
这里只给出一个示例:
/************************************************************************/
/* 大小调整时,修改视野和投影 */
/************************************************************************/
void reshape(int w,int h)
{
//设定视口变换
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
//矩阵模式设为投影,并设定视野范围
glMatrixMode(GL_PROJECTION);//GL_TEXTURE GL_MODELVIEW
glLoadIdentity();
glOrtho(-8,8,-8,8,0,100);
//将模式修改为模型矩阵
glMatrixMode(GL_MODELVIEW);
}

9 glutMainLoop()

在程序中调用一次,使程序能够进入循环,等待输入。

10 glutPostRedisplay()

通常,有外界输入,为了使屏幕能够有相应的响应变化,需要调用该函数,重新绘制,显示输出。

原作者:stephenxjc_千年一笑

转自:http://stephenxjc.iteye.com/blog/724745
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: