Comp. Graphics5
#include <GL/glut.h> #define TOP_WIDTH 4.0 #define TOP_HEIGHT 0.5 #define ARM_HEIGHT 3.0 #define ARM_WIDTH 0.5 static GLint angle = 0; static GLint langle = 0; void draw_top() { glPushMatrix(); glScalef(TOP_WIDTH, TOP_HEIGHT, TOP_WIDTH); glutWireCube(1.0); glPopMatrix(); } void draw_leg() { glPushMatrix(); glScalef(ARM_WIDTH,ARM_HEIGHT,ARM_WIDTH); glutWireCube(1.0); glPopMatrix(); } void draw_table() { glRotatef(angle, 0.0, 1.0, 0.0); draw_top(); //draw front left leg glPushMatrix(); glTranslatef(-TOP_WIDTH/2+ARM_WIDTH/2,-TOP_HEIGHT/2,TOP_WIDTH/2-ARM_WIDTH/2); glRotatef(langle, 0.0, 0.0, 1.0); glTranslatef(0,-ARM_HEIGHT/2,0); draw_leg(); glPopMatrix(); //draw front right leg glPushMatrix(); glTranslatef(TOP_WIDTH/2-ARM_WIDTH/2,-TOP_HEIGHT/2-ARM_HEIGHT/2, TOP_WIDTH/2-ARM_WIDTH/2); draw_leg(); glPopMatrix(); //draw back left leg glPushMatrix(); glTranslatef(-TOP_WIDTH/2+ARM_WIDTH/2,-TOP_HEIGHT/2-ARM_HEIGHT/2, -TOP_WIDTH/2+ARM_WIDTH/2); draw_leg(); glPopMatrix(); //draw back right leg glPushMatrix(); glTranslatef(TOP_WIDTH/2-ARM_WIDTH/2,-TOP_HEIGHT/2-ARM_HEIGHT/2, -TOP_WIDTH/2+ARM_WIDTH/2); draw_leg(); glPopMatrix(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor3f(1.0, 0.0, 0.0); draw_table(); glFlush(); glutSwapBuffers(); } void mouse(int btn, int state, int x, int y) { if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) { angle += 5.0; if( angle> 360.0 ) angle-= 360.0; glutPostRedisplay(); } } void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-10.0, 10.0, -10.0 * (GLfloat) h / (GLfloat) w, 10.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-10.0 * (GLfloat) w / (GLfloat) h, 10.0 * (GLfloat) w / (GLfloat) h, 0.0, 10.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myinit() { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 0.0, 0.0); } static void key(unsigned char key, int x, int y) { switch (key) { case 27 : case 'q': exit(0); break; case 'l': langle=langle+5; break; } glutPostRedisplay(); } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("robot"); myinit(); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutMouseFunc(mouse); glutKeyboardFunc(key); glutMainLoop(); }