动画制作(日地月系统动图实例)"/>
【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修行】动画制作(日地月系统动图实例)
发布评论