/* Example: octahedron.c */
/* This example program draws a multicolored octahedron spinning * like a top. The drawoctahedron subroutine demonstrates how * triangle meshes, including the swaptmesh() subroutine, * are used. * The c3f() subroutine sets vertex colors; you can ignore these * calls if you are studying the logic of mesh drawing. * All rotation and hidden surface removal are handled in the * main() routine. The calculations of the rotation angles are * based on Euler's equations for a spinning top. * On adapters without a z-buffer, this program will not display * the octahedron correctly, since it employs the z-buffer to * remove hidden surfaces. */
#include <gl/gl.h>
float octdata[6][3] = { /* positions of the six vertices of octahedron */ { 1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, {-1.0, 0.0, 0.0}, {0.0, -1.0, 0.0}, {0.0, 0.0, -1.0} };
float colordata[6][3] = { /* colors of the vertices */ {1.0, 0.0, 0.0}, /* red */ {0.0, 1.0, 0.0}, /* green */ {0.0, 0.0, 1.0}, /* blue */ {0.0, 1.0, 1.0}, /* cyan */ {1.0, 0.0, 1.0}, /* magenta */ {1.0, 1.0, 0.0} }; /* yellow */
void drawoctahedron() {
bgntmesh(); /* use triangle mesh to draw the octahedron */ c3f (colordata[0]); v3f (octdata [0]); c3f (colordata[1]); v3f (octdata[1]); c3f (colordata[2]); v3f (octdata[2]); /* vertices in first triangle are 0, 1, 2 */ c3f (colordata[3]); v3f (octdata[3]); /* second triangle - 1, 2, 3 */ swaptmesh(); /* swap vertex order (2,3) -> (3,2) */ c3f (colordata[4]); v3f (octdata[4]); /* third triangle - 3, 2, 4 */ c3f (colordata[0]); v3f (octdata[0]); /* fourth triangle - 2, 4, 0 */ swaptmesh(); /* swap vertex order (4,0) -> (0,4) */ c3f (colordata[5]); v3f (octdata[5]); /* fifth triangle - 0, 4, 5 */ c3f (colordata[3]); v3f (octdata[3]); /* sixth triangle - 4, 5, 3 */ swaptmesh(); /* swap vertex order (5,3) -> (3,5) */ c3f (colordata[1]); v3f (octdata[1]); /* seventh trinagle - 3, 5, 1 */ c3f (colordata[0]); v3f (octdata [0]); /* eigth triangle - 5, 1, 0 */ endtmesh();
}
main() {
long prec=0, spin=0; long i; prefposition(100, 500, 100, 500); /* location of window to be opened */ winopen("octahedron"); ortho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); zbuffer(TRUE); /* hidden surfaces removed with z buffer */ doublebuffer(); /* for smooth motion */ RGBmode(); /* direct color mode */ gconfig(); /* reconfigure for RGBmode and doublebuffer */ for (i=0; i<1500; i++) { pushmatrix(); /* save viewing transformation */ translate (0.0, -1.0, 0.0); /* make origin the bottom of the oct */ rotate (prec, 'y'); /* precession of axis */ rotate (323, 'x'); /* inclination of 32.3 degrees */ rotate (spin, 'y'); /* spin around axis */ translate (0.0, 1.0, 0.0); /* center in the middle of the window */ prec += 15; spin += 45; if (prec > 3600) prec -= 3600; if (spin > 3600) spin -= 3600; cpack(0); /* color black */ clear(); zclear(); /* clear the z buffer */
drawoctahedron(); swapbuffers(); /* show completed drawing */ popmatrix(); /* restore viewing transformation */ }
}
Triangular Meshes in GL3.2 Version 4 for AIX: Programming Concepts explains how to specify three-dimensional objects that are composed of triangular faces.