void loadModel() { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); model.loadFromFile("models/teapot.tri"); mode = 1;//translation printf("Current mode: translation\n"); useWorldCoordinate = true; printf("Using world coordinate\n"); initClipping(); model.initTransform(); camera.initTransform(); }
void myInit() { ballModel.loadFromFile("models/balls.tri"); TRIobj=&ballModel; glEnable(GL_DEPTH_TEST); glClearColor(0,0,0,1.0); glewInit(); if(glewIsSupported("GL_VERSION_2_0")) printf("Ready for OpenGL 2.0\n"); else { printf("GLSL not supported\n"); exit(1); } //typedef bool (*PFNWGLSWAPINTERVALFARPROC)(int); //PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0; //wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress("wglSwapIntervalEXT"); //wglSwapIntervalEXT(1); shaderInit(); changeShader(currentShader); materialInit(); lightInit(); timeNow=timeOld=glutGet(GLUT_ELAPSED_TIME); }
void myKeyboard(unsigned char key, int x, int y) { switch(key) { /** Optional: implement some keyboard function here */ case 27: exit(0); break; // change mode case '1': case '2': case '3': case '4': case '5': case '6': case '7': mode = (int)(key - '0'); printf("Current mode: %d\n", mode); break; case '8': mode = 8; doClipping = (!doClipping) ? true : false; printf("%s\n", (doClipping) ? "Enable clipping" : "Disable clipping"); break; case '9': useWorldCoordinate = (!useWorldCoordinate) ? true : false; printf("%s\n", (useWorldCoordinate) ? "Using world coordinates" : "Not using world coordinates"); model.initTransform(); camera.initTransform(); //initObjTransform(); //initCamTransform(); break; case '0': printf("RESET!!!\n"); loadModel(); break; // transformation case 'd': if(mode == 1) //model.translate.x += 10; model.updateTranslate(10, 0, 0); else if(mode == 2) model.updateRotationy(3.0, 1.0, 0.0, 0.0); else if(mode == 3) //model.scale.x += 0.1; model.updateScale(1.1, 1, 1); else if(mode == 5) { camera.position.x += 5; camera.lookAt.x += 5; } else if(mode == 6) camera.updateRotationy(-3.0, 1.0, 0.0, 0.0); break; case 'q': if(mode == 1) //model.translate.y += 10; model.updateTranslate(0, 10, 0); else if(mode == 2) model.updateRotationz(3.0, 0.0, 1.0, 0.0); else if(mode == 3) //model.scale.y += 0.1; model.updateScale(1, 1.1, 1); else if(mode == 5) { camera.position.y += 5; camera.lookAt.y += 5; } else if(mode == 6) camera.updateRotationz(-3.0, 0.0, 1.0, 0.0); break; case 's': if(mode == 1) //model.translate.z += 10; model.updateTranslate(0, 0, 10); else if(mode == 2) model.updateRotationx(3.0, 0.0, 0.0, 1.0); else if(mode == 3) //model.scale.z += 0.1; model.updateScale(1, 1, 1.1); else if(mode == 5) { camera.position.z += 5; camera.lookAt.z += 5; } else if(mode == 6) camera.updateRotationx(-3.0, 0.0, 0.0, 1.0); break; case 'a': if(mode == 1) //model.translate.x -= 10; model.updateTranslate(-10, 0, 0); else if(mode == 2) model.updateRotationy(-3.0, 1.0, 0.0, 0.0); else if(mode == 3) //model.scale.x -= 0.1; model.updateScale(0.9, 1, 1); else if(mode == 5) { camera.position.x -= 5; camera.lookAt.x -= 5; } else if(mode == 6) camera.updateRotationy(3.0, 1.0, 0.0, 0.0); break; case 'e': if(mode == 1) //model.translate.y -= 10; model.updateTranslate(0, -10, 0); else if(mode == 2) model.updateRotationz(-3.0, 0.0, 1.0, 0.0); else if(mode == 3) //model.scale.y -= 0.1; model.updateScale(1, 0.9, 1); else if(mode == 5) { camera.position.y -= 5; camera.lookAt.y -= 5; } else if(mode == 6) camera.updateRotationz(3.0, 0.0, 1.0, 0.0); break; case 'w': if(mode == 1) //model.translate.z -= 10; model.updateTranslate(0, 0, -10); else if(mode == 2) model.updateRotationx(-3.0, 0.0, 0.0, 1.0); else if(mode == 3) //model.scale.z -= 0.1; model.updateScale(1, 1, 0.9); else if(mode == 5) { camera.position.z -= 5; camera.lookAt.z -= 5; } else if(mode == 6) camera.updateRotationx(3.0, 0.0, 0.0, 1.0); break; // zoom in/out case 'z': if(mode == 5) camera.lookAtDist -= 5; camera.updateRevolution(0, 0, 0, 0); break; case 'x': if(mode == 5) camera.lookAtDist += 5; camera.updateRevolution(0, 0, 0, 0); break; // shear / camera rotation around VRP case 't': if(mode == 4) model.updateShear(1.0, 0, 1); else if(mode == 7) camera.updateRevolution(((int)camera.revAngle[0] + 3) % 360, 1, 0, 0); else if(mode == 8 && doClipping) xMin += 10; break; case 'y': if(mode == 4) model.updateShear(-1.0, 0, 1); else if(mode == 7) camera.updateRevolution(((int)camera.revAngle[0] - 3) % 360, 1, 0, 0); else if(mode == 8 && doClipping) xMin -= 10; break; case 'T': if(mode == 4) model.updateShear(1.0, 0, 2); else if(mode == 8 && doClipping) xMax += 10; break; case 'Y': if(mode == 4) model.updateShear(-1.0, 0, 2); else if(mode == 8 && doClipping) xMax -= 10; break; case 'g': if(mode == 4) model.updateShear(1.0, 1, 0); else if(mode == 7) camera.updateRevolution(((int)camera.revAngle[1] + 3) % 360, 0, 1, 0); else if(mode == 8 && doClipping) yMin += 10; break; case 'h': if(mode == 4) model.updateShear(-1.0, 1, 0); else if(mode == 7) camera.updateRevolution(((int)camera.revAngle[1] - 3) % 360, 0, 1, 0); else if(mode == 8 && doClipping) yMin -= 10; break; case 'G': if(mode == 4) model.updateShear(1.0, 1, 2); else if(mode == 8 && doClipping) yMax += 10; break; case 'H': if(mode == 4) model.updateShear(-1.0, 1, 2); else if(mode == 8 && doClipping) yMax -= 10; break; case 'b': if(mode == 4) model.updateShear(1.0, 2, 0); else if(mode == 7) camera.updateRevolution(((int)camera.revAngle[2] + 3) % 360, 0, 0, 1); else if(mode == 8 && doClipping) zMin += 10; break; case 'n': if(mode == 4) model.updateShear(-1.0, 2, 0); else if(mode == 7) camera.updateRevolution(((int)camera.revAngle[2] - 3) % 360, 0, 0, 1); else if(mode == 8 && doClipping) zMin -= 10; break; case 'B': if(mode == 4) model.updateShear(1.0, 2, 1); else if(mode == 8 && doClipping) zMax += 10; break; case 'N': if(mode == 4) model.updateShear(-1.0, 2, 1); else if(mode == 8 && doClipping) zMax -= 10; break; // change model case ',': model.loadFromFile("models/Gym.tri"); break; case '.': model.loadFromFile("models/Fighter.tri"); break; case '/': model.loadFromFile("models/Csie.tri"); break; case ';': model.loadFromFile("models/Easter.tri"); break; case '\'': model.loadFromFile("models/Car_road.tri"); break; } }
void display() { glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); /** Todo: Create your own affine transformation matrix here*/ glLoadIdentity(); // rotation glMultMatrixf(camera.rotate.m); gluLookAt(camera.position.x, camera.position.y, camera.position.z, camera.lookAt.x, camera.lookAt.y, camera.lookAt.z, camera.up.x, camera.up.y, camera.up.z); // world coordinate glPushMatrix(); glBegin(GL_LINES); // x axis glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(500.0, 0.0, 0.0); // y axis glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 500.0, 0.0); // z axis glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 500.0); glEnd(); glPopMatrix(); /** Todo: Draw Model (clipping and non-clipping version)*/ glPushMatrix(); //glScalef(model.scale.x, model.scale.y, model.scale.z); //glTranslatef(model.translate.x, model.translate.y, model.translate.z); glMultMatrixf(model.scale.m); glMultMatrixf(model.translate.m); glMultMatrixf(model.shear.m); glMultMatrixf(model.rotate.m); glGetFloatv(GL_MODELVIEW_MATRIX, mModelView.m); model.drawAxes(); model.drawBox(); if(doClipping) drawModelClipping(); else model.drawModel(); glPopMatrix(); // clipping field if(doClipping) { glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glColor3f(1.0, 1.0, 0.0); glBegin(GL_QUADS); glVertex3f(2.0 * xMin / windowWidth, 2.0 * yMin / windowHeight, -1.0); glVertex3f(2.0 * xMax / windowWidth, 2.0 * yMin / windowHeight, -1.0); glVertex3f(2.0 * xMax / windowWidth, 2.0 * yMax / windowHeight, -1.0); glVertex3f(2.0 * xMin / windowWidth, 2.0 * yMax / windowHeight, -1.0); glEnd(); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } glutSwapBuffers(); }