Up: OpenGL Wagon examples. Next: 3D example.
This is a still shot from the animation. In the animation, wagons continually roll left across the window, with their wheels rotating as they move.

1 #include <stdio.h>
2 #include <GL/glut.h>
3 #include <math.h>
4 #include "wagon.h"
5 #define MOVEMENT_RATE 0.0002
6 // Initializes information for drawing within OpenGL.
7 void init() {
8 glClearColor(1.0, 1.0, 1.0, 0.0); // Set window color to white.
9 glMatrixMode(GL_PROJECTION); // Set projection parameters.
10 gluOrtho2D(0.0, 3.0, -.25, .75); // Set viewable coordinates.
11 wagonInit();
12 }
13 // Draw a wagon that has traveled across the window the given distance.
14 void drawWagonAt(double dist) {
15 glPushMatrix();
16 glTranslatef(3.0 - dist, 0.0, 0.0);
17 wagonDraw(dist / 0.1);
18 glPopMatrix();
19 }
20 // Draws the current image.
21 void draw() {
22 // Compute how far the youngest wagon on-screen has traveled.
23 double offs = fmod(MOVEMENT_RATE * glutGet(GLUT_ELAPSED_TIME), 1.5);
24 glClear(GL_COLOR_BUFFER_BIT); // Clear display window.
25 glColor3f(0.0, 0.0, 0.0);
26 drawWagonAt(offs); // Draw the wagons. (Up to three
27 drawWagonAt(offs + 1.5); // may be on-screen at once.)
28 drawWagonAt(offs + 3.0);
29 glFlush(); // Process all OpenGL routines as quickly as possible.
30 }
31 // Arranges that the window will be redrawn roughly every 40 ms.
32 void idle() {
33 static int lastTime = 0; // time of last redraw
34 int time = glutGet(GLUT_ELAPSED_TIME); // current time
35 if(lastTime == 0 || time >= lastTime + 40) {
36 lastTime = time;
37 glutPostRedisplay();
38 }
39 }
40 // When window becomes visible, we want the window to
41 // continuously repaint itself.
42 void visible(int vis) {
43 glutIdleFunc(vis == GLUT_VISIBLE ? idle : NULL);
44 }
45 int main(int argc, char **argv) {
46 glutInit(&argc, argv);
47 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
48 glutInitWindowPosition(50, 100); // Set up display window.
49 glutInitWindowSize(450, 150);
50 glutCreateWindow("Moving Wagon");
51 init();
52 glutDisplayFunc(draw);
53 glutVisibilityFunc(visible);
54 glutMainLoop();
55 return 0;
56 }
57 // To compile: gcc moving_main.c wagon.c wheel.c -lglut -lGLU -lGL -lm