概述
#include<GL/glut.h>//引入头文件。
#include <stdio.h>
#include <math.h>
int time = 0;
int count = 0;
const int n = 20;
GLfloat R = 0.1f;
const GLfloat Pi = 3.1415926536f;
GLfloat v[20] = { 0.0f };
//初始化顶点数组
void initVertex() {
for (int i = 0; i < n; ++i) {
v[i] = R * cos(2 * Pi / n * i);
}
}
//绘制顶点
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for (i = 0; i < n; ++i) {
glVertex2f(v[i], R*sin(2 * Pi / n * i));
}
glEnd();
glFlush();
glutSwapBuffers();
}
void upDisplay() {
//更改圆形顶点x的数据,让它动起来
for (int i = 0; i < n; ++i) {
v[i] += 0.1;
}
if (v[0] >= 1) {
initVertex();
}
display();
}
void moveDisplay(int value)
{
glutPostRedisplay();//强制重绘
upDisplay(); //更改圆形顶点数据
glutTimerFunc(125, moveDisplay, 1); //等待125毫秒再次调用moveDisplay函数
if (++count % 8 == 0) {
time++;
printf("程序已运行%d秒n", time);//8个125毫秒=1000毫秒=1秒,一秒输出一次时间
}
}
void init()
{//状态变量的初始化工作
glClearColor(0.0, 0.0, 0.0, 0.0);//设置清屏颜色,模式必须是RGBA
glColor3f(1.0, 1.0, 1.0);//设置绘制颜色
initVertex(); //初始化圆形顶点数组
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);//(x,y,width,height)左下角(x,y)宽width高height。规定画布区域。
glMatrixMode(GL_PROJECTION);//指定哪个矩阵会受后续变换函数的影响
glLoadIdentity();//将当前矩阵设置为单位矩阵
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
//gluOrtho2D(-2.0, 2.0, -2.0, 2.0); //指定一个二维可视裁剪区域(Left,Right,Bottom,Top)左下(Left,Bottom)右上(Right,Top)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouseClick(int button, int state, int x, int y)
{//鼠标单击事件
switch (button) //glutIdleFunc当循环队列为空时则触发该事件。
{ //问题:循环过快。
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN) {
moveDisplay(1);
}
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
{
}
break;
default:
break;
}
}
void mouseMotion(int x, int y)
{//鼠标按下后拖动时不断调用函数,基于左上角为原点的坐标系
//std::cout << x << " " << y << std::endl;
//printf("%d------%d", x, y);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);//初始化
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//设置颜色模式(RGB/RGBA/INDEX)和缓存模式(单/双)
glutInitWindowSize(500, 500);//设置窗口大小
glutInitWindowPosition(400, 180);//设置窗口位置
glutCreateWindow("滚动的圆");//创建窗口。默认左上角和300*300。
init();//如上init函数进行设置
glutDisplayFunc(display);//回调函数display。每次窗口重绘时调用的函数。
//glutReshapeFunc(reshape);//规定窗口
glutMouseFunc(mouseClick); //鼠标单击事件
//glutMotionFunc(mouseMotion);//鼠标移动时间
glutMainLoop();//进入无限事件循环
}
试修改下面的const int n的值,观察当n=3,4,5,8,10,15,20,30,50等不同数值时输出的变化情况
将GL_POLYGON改为GL_LINE_LOOP、GL_POINTS等其它方式,观察输出的变化情况
这个例子实现了一个会滚动的圆。看了好几个例子才写出来的。方法比较简单,不知道还有没有其他的方式让图形动起来呢?
最后
以上就是有魅力抽屉为你收集整理的OpenGL实现会动的圆的全部内容,希望文章能够帮你解决OpenGL实现会动的圆所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复