#include "GL/glut.h" volatile unsigned long long int timer_ticks = 0; /// Displays a square based pyramid from a base position, height and side length /// \param x X coordinate of the center /// \param y Y coordinate of the center /// \param z Z coordinate of the center /// \param c Side length of the square /// \param h Height of the pyramid void display_pyramid(float x, float y, float z, float c, float h) { glBegin(GL_TRIANGLES); // First side glColor3f(1,0,0); // Summit glVertex3f(x,y+h,z); glVertex3f(x+c/2,y,z+c/2); glVertex3f(x-c/2,y,z+c/2); // Second side glColor3f(0,1,0); glVertex3f(x,y+h,z); glVertex3f(x+c/2,y,z+c/2); glVertex3f(x+c/2,y,z-c/2); // Third side glColor3f(0,0,1); glVertex3f(x,y+h,z); glVertex3f(x-c/2,y,z+c/2); glVertex3f(x-c/2,y,z-c/2); // Fourth side glColor3f(1,1,0); glVertex3f(x,y+h,z); glVertex3f(x-c/2,y,z-c/2); glVertex3f(x+c/2,y,z-c/2); glEnd(); // Bottom glBegin(GL_QUADS); glColor3f(0,1,1); glVertex3f(x-c/2,y,z-c/2); glVertex3f(x-c/2,y,z+c/2); glVertex3f(x+c/2,y,z+c/2); glVertex3f(x+c/2,y,z-c/2); glEnd(); } /// Draw a pyramid rotated around its axis void display_rotating_pyramid(float x, float y, float z, float c, float h, float alpha) { glPushMatrix(); glTranslatef(x,0,z); glRotatef(alpha,0,1,0); glTranslatef(-x,0,-z); display_pyramid(x,y,z,c,h); glPopMatrix(); } void display() { float angleY = 1*timer_ticks; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); // Prepare view glLoadIdentity(); gluPerspective(60,(double)glutGet(GLUT_WINDOW_WIDTH)/(double)glutGet(GLUT_WINDOW_HEIGHT),10,30000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(10, 10, 10, 0, 0, 1, 0, 1, 0); display_rotating_pyramid(0,-2,0,2,4,angleY); display_rotating_pyramid(3,-2,0,1,5,angleY); display_rotating_pyramid(-2,-2,4,3,2,angleY); glutSwapBuffers(); } void update_angle(int value) { timer_ticks++; glutTimerFunc(50,update_angle,0); } int main(int argc, char** argv) { glutInit(&argc,argv); // Generate window with GLUT glutInitDisplayMode(GLUT_RGB| GLUT_DEPTH | GLUT_DOUBLE); glutCreateWindow("Hello"); // Init OpenGL glClearColor(0,0,0,1); glClearDepth(1.0); // glEnable(GL_LIGHTING); // glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glViewport(0,0,glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT)); glutIdleFunc(display); glutTimerFunc(50,update_angle,0); // Enters main loop, managed by GLUT glutMainLoop(); return 0; }