Untitled
unknown
c_cpp
3 years ago
8.4 kB
10
Indexable
#ifdef __APPLE__ #include <GLUT/glut.h> #else #include<bits/stdc++.h> #include <GL/gl.h> #include<GL/glu.h> #include <GL/glut.h> #include <stdlib.h> #endif #include <stdlib.h> static int slices = 16; static int stacks = 16; double ex=0, ey=5, ez=50; double cx=0, cy=5, cz=0; double ux=0, uy=1, uz=0; double tx=0,ty=0,tz=0; GLfloat ang = 0; int rot = 1; /* GLUT callback Handlers */ static void resize(int width, int height) { const float ar = (float) width / (float) height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-ar, ar,-ar, ar, 2.0, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity() ; } GLfloat arr[8][3]= { {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0}, {1,0,1}, {1,1,1}, {0,1,1}, {0,0,1} }; static GLubyte ind[6][4]= { {0,1,2,3}, {1,4,5,2}, {4,7,6,5}, {7,0,3,6}, {3,2,5,6}, {0,7,4,1} }; void draw_cube(GLfloat c1,GLfloat c2,GLfloat c3 ) { GLfloat mat_ambient[] = { 0.4*c1, 0.4*c2, 0.4*c3, 1.0f }; GLfloat mat_diffuse[] = { c1, c2, c3, 1.0f }; GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glBegin(GL_QUADS); for(int i=0; i<6; i++) { glVertex3fv(&arr[ind[i][0]][0]); glVertex3fv(&arr[ind[i][1]][0]); glVertex3fv(&arr[ind[i][2]][0]); glVertex3fv(&arr[ind[i][3]][0]); } glEnd(); } int light_switch = 1; void light0() { GLfloat no_light[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat light_ambient[] = { .5f, 0.5f, 0.5f, 1.0f}; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat light_position[] = {200, 200, 100, 0.0 }; if(light_switch) glEnable(GL_LIGHT0); else glDisable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position); } void draw_A() { glPushMatrix(); glTranslatef(0,0,0); glRotatef(0, 0,1,0); // glScalef(3,3,3); glPushMatrix(); glRotatef(-30,0,0,1); glScalef(2,16,2); draw_cube(0,1,0); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(16,0,0); glRotatef(0, 0,1,0); // glScalef(3,3,3); glPushMatrix(); glRotatef(30,0,0,1); glScalef(2,16,2); draw_cube(0,1,0); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(4,4,0); glRotatef(0, 0,1,0); // glScalef(3,3,3); glPushMatrix(); //glRotatef(30,0,0,1); glScalef(10,2,2); draw_cube(1,1,0); glPopMatrix(); glPopMatrix(); } void draw_N() { glPushMatrix(); glPushMatrix(); glTranslatef(0,0,0); glRotatef(0,0,1,0); glPushMatrix(); glTranslatef(0,0,0); glRotatef(0,0,0,0); glScalef(2,16,2); draw_cube(1,0,0); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(0,0,0); glRotatef(0,0,1,0); glPushMatrix(); glTranslatef(9,0,0); glRotatef(30,0,0,1); glScalef(2,16,2); draw_cube(0,1,0); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(0,0,0); glRotatef(0,0,1,0); glPushMatrix(); glTranslatef(9,0,0); glRotatef(0,0,0,0); glScalef(2,16,2); draw_cube(0,0,1); glPopMatrix(); glPopMatrix(); glPopMatrix(); } static void display(void) { const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; const double a = t*90.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1,0,0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-5, 5,-5, 5, 2.0, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity() ; gluLookAt(ex,ey,ez,cx,cy,cz,ux,uy,uz); light0(); glPushMatrix(); glTranslatef(0,0,0); glRotatef(ang,0,1,0); draw_A(); glPopMatrix(); glPushMatrix(); glTranslatef(-21.00000,0,0); //glTranslatef(0,0,0); glRotatef(ang,0,1,0); draw_N(); glPopMatrix(); glutSwapBuffers(); } double radius = 90, ay=90,ap=0,ar=90; void yaw() { cx=0; cz=0; cx= ex+radius*(cos(ay*3.1416/180)); cz= ez+radius*(sin(ay*3.1416/180)); } void pitch() { cy=0; cz=0; cy= ey+radius*(cos(ap*3.1416/180)); cz= ez+radius*(sin(ap*3.1416/180)); } void roll() { ux = radius*(cos(ar*3.1416/180)); uy = radius*(sin(ar*3.1416/180)); } static void key(unsigned char key, int x, int y) { switch (key) { case 27 : case 'q': exit(0); break; case '+': slices++; stacks++; break; case 'y': ay+=5; yaw(); glutPostRedisplay(); break; case 'Y': ay-=5; yaw(); glutPostRedisplay(); break; case 'p': ap+=5; pitch(); glutPostRedisplay(); break; case 'P': ap-=5; pitch(); glutPostRedisplay(); break; case 'r': ar+=5; roll(); glutPostRedisplay(); break; case 'R': ar-=5; roll(); glutPostRedisplay(); break; case '-': if (slices>3 && stacks>3) { slices--; stacks--; } break; case 'l': light_switch = !light_switch; break; case 'Z': tx-=1; printf("%lf %lf %lf\n",tx,ty,tz); break; case 'X': tx+=1; printf("%lf %lf %lf\n",tx,ty,tz); break; case 'C': ty-=.5; printf("%lf %lf %lf\n",tx,ty,tz); break; case 'V': ty+=.5; printf("%lf %lf %lf\n",tx,ty,tz); break; case 'B': tz-=1; printf("%lf %lf %lf\n",tx,ty,tz); break; case 'N': tz+=1; printf("%lf %lf %lf\n",tx,ty,tz); break; case 'w': ez--; cz--; break; case 's': ez++; cz++; break; case 'd': ex--; cx--; break; case 'a': ex++; cx++; break; case 'W': ey--; cy--; break; case 'S': ey++; cy++; break; case 'k': GLfloat tmp; tmp=ey; ey=ez; ez=ey; //swap(ey,ez); break; } glutPostRedisplay(); } static void idle(void) { glutPostRedisplay(); } void animate() { if(rot) { ang+=0.1; glutPostRedisplay(); } if(rot==0) { ang = 0; glutPostRedisplay(); } } const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; /* Program entry point */ int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(640,480); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("GLUT Shapes"); glutReshapeFunc(resize); glutDisplayFunc(display); glutKeyboardFunc(key); glutIdleFunc(idle); glutIdleFunc(animate); ///glClearColor(1,1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glutMainLoop(); return EXIT_SUCCESS; }
Editor is loading...