opengl画长方形,并做动画,鼠标响应事件等的代码及解释。

工程既其他的文件等不再解释,请看前面的文章。

//设置矩形旋转的角度

static GLfloat spin = 0.0f;

//

void spinDisplay(void)

{

spin = spin + 2.0f;

if(spin > 360.0f)

spin = spin - 360.0f;

//刷新界面

glutPostRedisplay();

}

//函数在窗口改变大小的时候被调用,传入参数分别是窗口的长和高

void reshape(int w, int h)

{

//viewport并非必须调用,缺省是屏幕大小,指定需要作业的屏幕大小,不能大于窗口大小。

glViewport(0.0f, 0.0f, (GLsizei)w, (GLsizei)h);

//指定下面矩阵操作函数操作的矩阵。

glMatrixMode(GL_PROJECTION);

//恢复单位矩阵

glLoadIdentity();

//创建一个正交平行的视景体,这个其实gl中坐标的的大小,分别代表x,y,z,组两个,比如前两个代表x的最大负值和最大正值。

glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, -1.0f, 1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

//标事件的回调函数,参数如下:

//button表示鼠标的键,有三个

// GLUT_LEFT_BUTTON

// GLUT_MIDDLE_BUTTON

// GLUT_RIGHT_BUTTON

//state有表示鼠标的事件,是按下还是松开

// GLUT_DOWN

// GLUT_UP

//x y表示鼠标事件发生的坐标,是普通的屏幕坐标,不是opengl中的坐标,既x是从左向右依次变大,从0开始,y是从上到下,从0开始。

void mouse(int button, int state, int x, int y)

{

switch (button) {

case GLUT_LEFT_BUTTON:

if (state == GLUT_DOWN) {

//设置空闲处理函数,当程序没有事件需要处理的时候,就调用这个函数。

glutIdleFunc(spinDisplay);

}

break;

case GLUT_RIGHT_BUTTON:

if (state == GLUT_DOWN) {

glutIdleFunc(NULL);

}

default:

break;

}

}


void display(void)

{

//使用当前设置的颜色清屏,如果不这么做,你得到的是一个很花,并且没有规律的背景

glClear(GL_COLOR_BUFFER_BIT);

//把当前的矩阵压入堆栈

glPushMatrix();

//对以后的图像都做一个旋转,旋转是绕Z轴整方向,做逆时针做角度为spin的旋转。

glRotatef(spin, 0.0f, 0.0f, 1.0f);

//设置当前的使用的颜色

glColor3f(0.0f, 0.0f, 1.0f);

glRectf(-25.0f, -25.0f, 25.0f, 25.0f);

//恢复矩阵。

glPopMatrix();

//强制把上面的命令都开始执行,使用了GLUT_DOUBLE模式,因此调用glutSwapBuffers

//glFlush();

glutSwapBuffers();

}


void init(void)

{

//指定屏幕清除颜色。

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

//指定图像的着色方式。

glShadeModel(GL_FLAT);

}


int main (int argc, char * argv[])

{

//glut严格的说不是opengl的一部分,是为了支持使用opengl的程序方便的创建和管理窗口而做的,

//下面是它的初始化工作,一般情况下,我们需要把main函数的argv前面的const饰词去掉,以减少一个警告

glutInit(&argc, argv);

//初始化窗口的显示模式,使用双缓冲系统,颜色使用rgb

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

//初始化窗口大小400*400

glutInitWindowSize(250, 250);

//初始化窗口的为止为x = 100,y = 100

glutInitWindowPosition(100, 100);

//创建标题为test的窗口

glutCreateWindow("test");

//初始化opengl

init();

//设置显示回调函数

glutDisplayFunc(display);

//设置窗口大小变化的时候的回调函数。

glutReshapeFunc(reshape);

//标事件的回调函数。

glutMouseFunc(mouse);

//程序开始运行。

glutMainLoop();

//严格的说,下面这句话不会执行到,只是为了符合iso标准C的格式。

return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值