实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动),请首先读懂代码,再修改代码,实现矩形在窗口内沿着水平线匀速移动。为了实现这类要求,要做的就是将已经给出的旋转的代码块部分修改为平移的实现方法,完成在X轴方向上的水平匀速移动,在这个过程中还学习了不停的正方向和负方向上的匀速循环移动。效果如下图:
http://s10/middle/5e94b103xb201f7e9aee9&690
http://s2/middle/5e94b103xb201f8dde611&690
【注】代码如下:
#include<windows.h>
#include <GL/glut.h>
#include<GL/glu.h>
#include<GL/gl.h>
#include <stdlib.h>
static GLfloat spin = -35.0;
static GLint status = 1;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
//glRotatef(spin, 0.0, 0.0, 1.0);
glTranslatef(spin, 0.0, 0.0);//注意这里的spin为静态的全局变量
glColor3f(0.5, 0.5, 0.5);
glRectf(-10.0, -10.0, 10.0, 10.0);
glPopMatrix();
glutSwapBuffers();//PS:区别于glFlush();
}
void spinDisplay(void)
{
if (spin >= 30)
status = -1;
else if(spin<=-35)
status = 1;
spin += status*0.05;//这一行代码用来控制移动的速度
glutPostRedisplay();//使spin不停的变换,有些类似一个循环
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
//本行代码表明了颜色为单颜色方式,就是不适用混合色,后一种颜色覆盖前一种设置。
}
void reshape(int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);//视口的大小的设置
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);//二维裁剪窗口函数
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
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_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (400, 400);
glutInitWindowPosition (100, 100);
glutCreateWindow ("矩形平移效果");
init ();
glutDisplayFunc(display);//调用初始化的图形函数
glutReshapeFunc(reshape);//调用开始变换的图形函数
glutMouseFunc(mouse);//调用鼠标的响应函数
glutMainLoop();
return 0;
}
加载中,请稍候......