GLUT常用函数介绍

GLUT常用函数介绍

 stephenxjc_千年一笑

2010-7-29

 

 

对象:GLUT的入门级(初学者)

关键字:GLUT、函数

核心内容:主要是通过在一个具体的程序中函数的作用

平台:visual studio2008,需要配置好OpenGL32.libGLu32.libGlAux.Libglut32.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编码,xy为鼠标的当前的位置。

 

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

意义

GLUT_ACTIVE_ALT

Alt被按下

GLUT_ACTIVE_CTRL

Ctrl被按下

GLUT_ACTIVE_SHIFT

ShiftCaps 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()

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

 

附件当中是文章的docx版本,并附上利用glut和opengl编写的茶壶示例

你可能感兴趣的:(编程,windows,UP,360)