【OpenGL修行】动画制作(日地月系统动图实例)

编程入门 行业动态 更新时间:2024-10-27 19:20:16

【OpenGL修行】<a href=https://www.elefans.com/category/jswz/34/1716512.html style=动画制作(日地月系统动图实例)"/>

【OpenGL修行】动画制作(日地月系统动图实例)

其实动画制作就是播放连续的画面,只要够快就会觉得是画面在动。需要用到两个知识点。

双缓冲技术

其实就是在一张纸上画,在另一张纸上展示,而不是在同一张纸上边画边展示,假设画一张画需要a秒,画完后再展示b秒:
a<=b:那单缓冲也没问题;
a>b:也就是说在规定的时间内画不出作品,那不就完蛋了,给人家放一副半成品出来?
所以当画面较为复杂的时候就必须要使用双缓冲技术。

实现连续动画

我们需要在CPU空闲的时间绘制。
这里的“在CPU空闲的时间绘制”和我们在第一课讲的“在需要绘制的时候绘制”有些共通,都是“在XX时间做XX事”,GLUT工具包也提供了一个比较类似的函数:glutIdleFunc,表示在CPU空闲的时间调用某一函数。其实GLUT还提供了一些别的函数,例如“在键盘按下时做某事”等。

glutIdleFunc(&myIdle);

Code

#include<GL/glut.h>
#include<math.h>
#include<stdio.h>
#include<time.h>
static int day = 200;
GLfloat Pi = 3.1415926;
int a = 150000000, b = 38000000;
int r1 = 69600000, r2 = 15945000, r3 = 4345000;
void display()
{glEnable(GL_DEPTH_TEST);glClearColor(0.1f, 0.1f, 0.1f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60, 1, 100000, 600000000);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(200000000, 200000000, 200000000, 0, 0, 0, 0, 0, 1);/*绘制地球运动轨道*/glBegin(GL_LINE_LOOP);glColor3f(0.0f, 1.0f, 1.0f);for (int i = 0; i < 100; i++)glVertex3f(a * cos(2 * i * Pi / 100), a * sin(2 * i * Pi / 100), 0.0f);glEnd();/*绘制太阳*/glColor3f(1.0f, 0.0f, 0.0f);glutSolidSphere(r1, 20, 20);/*绘制地球*/glColor3f(0.0f, 0.0f, 1.0f);glRotatef(day / 360.0 * 360, 0, 0, -1);//度数为当前天数/一年的总天数*总度数glTranslatef(a, 0.0f, 0.0f);glutSolidSphere(r2, 20, 20);/*绘制月球轨道*/glBegin(GL_LINE_LOOP);glColor3f(0.0f, 1.0f, 1.0f);for (int i = 0; i < 100; i++)glVertex3f(b * cos(2 * i * Pi / 100), b * sin(2 * i * Pi / 100), 0.0f);glEnd();/*绘制月亮*/glColor3f(1.0f, 1.0f, 0.0f);glRotatef(day / 30 * 360.0 - day / 360.0 * 360.0, 0.0f, 0.0f, -1.0f);glTranslatef(b, 0.0f, 0.0f);glutSolidSphere(r3, 20, 20);glFlush();glutSwapBuffers();
}
void idle() {/*在CPU空闲的时间绘制*/++day;if (day >= 360)day = 0;display();
}
int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("日地月系统动图");glutDisplayFunc(&display);glutIdleFunc(&idle);glutMainLoop();return 0;
}



更多推荐

【OpenGL修行】动画制作(日地月系统动图实例)

本文发布于:2024-03-06 13:13:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1715419.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:动画制作   实例   系统   OpenGL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!