diff --git a/include/poly.h b/include/poly.h index 7fa226c..59802b1 100755 --- a/include/poly.h +++ b/include/poly.h @@ -15,6 +15,7 @@ int size; Vec* position; Vec* rotation; + Vec* normal; Color* color; public: Poly(); diff --git a/sources/main.cpp b/sources/main.cpp index 81e9249..c18caf1 100755 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -187,10 +187,21 @@ return 1; } - Vec viewer_zmove_pos = Vec(0.0f, 0.0f, 0.1f); - Vec viewer_zmove_neg = Vec(0.0f, 0.0f, -0.1f); - Vec viewer_xmove_pos = Vec(0.1f, 0.0f, 0.0f); - Vec viewer_xmove_neg = Vec(-0.1f, 0.0f, 0.0f); + // current viewport position + Vec viewer_pos = Vec(0.0f, 0.0f, -50.0f); + + // viewport movement delta + Vec viewer_zmove_pos = Vec(0.0f, 0.0f, -0.3f); + Vec viewer_zmove_neg = Vec(0.0f, 0.0f, 0.5f); + Vec viewer_xmove_pos = Vec(0.3f, 0.0f, 0.0f); + Vec viewer_xmove_neg = Vec(-0.3f, 0.0f, 0.0f); + + // current viewport rotation + Vec viewer_rot = Vec(0.0f, 0.0f, 0.0f); + + // viewport rotation delta + Vec viewer_zrot = Vec (0.0f, 0.0f, 2.0f); + Vec viewer_xrot = Vec (2.0f, 0.0f, 0.0f); Color black (0,0,0); Color blue (0,0,1); @@ -323,7 +334,7 @@ glEnable (GL_DEPTH_TEST); //enable light - glEnable(GL_LIGHTING); + //glEnable(GL_LIGHTING); //light info Vec l0_dir(0.0f, 0.0f, 0.0f); @@ -346,11 +357,8 @@ /////////////////////////////////////////////////////////////////////////// // Mainloop: - float deltay = 0.0f; - float deltaz = 0.0f; float deltacolor = 0.0f; - Vec viewer = Vec(0.0f, 0.0f, -50.0f); while (!done) { @@ -365,28 +373,36 @@ WINDOW_X/WINDOW_Y, // width/height ratio 1.0f, // near clipping plane 1000.0f); // far clipping plane + - // Place the viewer 50 units backward: + glMatrixMode(GL_MODELVIEW); + + //initial viewer position glLoadIdentity(); - glTranslatef(viewer.x(), viewer.y(), viewer.z()); - viewer.vardump(" "); - // Draw a rotating triangle: - glRotatef(deltay, 0.0f, 1.0f, 0.0f); // Rotation around the Y axis - glRotatef(deltaz, 1.0f, 0.0f, 0.0f); + //rotate viewer + glRotatef(viewer_rot.z(), 0.0f, 0.0f, 1.0f); + glRotatef(viewer_rot.x(), 1.0f, 0.0f, 0.0f); + //move viewer + glTranslatef(viewer_pos.x(), viewer_pos.y(), viewer_pos.z()); + + //draw cube cube->draw(); - cube->rotate(Vec(0.0f, 0.01f, 0.01f)); + cube->rotate(Vec(1.0f, 1.0f, 1.0f)); //myModel->draw(); + //light0.draw(); //light0.trace(); //light1.draw(); //light1.trace(); + // camera position + //////////////// // Check events: SDL_Event event; @@ -442,17 +458,17 @@ glClearColor(0.0f, 0.0f, 0.5f, 1.0f); }*/ - //scene rotation - if (keystate[SDLK_LEFT]) deltay -= 2.0f; - if (keystate[SDLK_RIGHT]) deltay += 2.0f; - if (keystate[SDLK_UP]) deltaz -= 2.0f; - if (keystate[SDLK_DOWN]) deltaz += 2.0f; + // rotate viewer + if (keystate[SDLK_LEFT]) viewer_rot.add(viewer_zrot); + if (keystate[SDLK_RIGHT]) viewer_rot.sub(viewer_zrot); + if (keystate[SDLK_UP]) viewer_rot.add(viewer_xrot); + if (keystate[SDLK_DOWN]) viewer_rot.sub(viewer_xrot); // move viewer - if (keystate[SDLK_w]) viewer.add(viewer_zmove_neg); - if (keystate[SDLK_s]) viewer.add(viewer_zmove_pos); - if (keystate[SDLK_a]) viewer.add(viewer_xmove_pos); - if (keystate[SDLK_d]) viewer.add(viewer_xmove_neg); + if (keystate[SDLK_w]) viewer_pos.add(viewer_zmove_neg); + if (keystate[SDLK_s]) viewer_pos.add(viewer_zmove_pos); + if (keystate[SDLK_a]) viewer_pos.add(viewer_xmove_pos); + if (keystate[SDLK_d]) viewer_pos.add(viewer_xmove_neg); if (keystate[SDLK_SPACE]) { deltacolor += 0.01f; diff --git a/sources/poly.cpp b/sources/poly.cpp index cad63e3..18da677 100755 --- a/sources/poly.cpp +++ b/sources/poly.cpp @@ -14,6 +14,7 @@ position = new Vec(0,0,0); rotation = new Vec(0,0,0); color = new Color(1,0,0); + normal = new Vec(0,0,0); setCenter(Vec(0,0,0)); } @@ -31,12 +32,21 @@ } setCenter(calcCenter()); + + //normal + Vec cur = rotate_xyz(*initpoints.at(1) - *position); + Vec prev = rotate_xyz(*initpoints.at(0) - *position); + Vec next = rotate_xyz(*initpoints.at(2) - *position); + prev = prev - cur; + next = next - cur; + normal = prev.cross(next).normalize().clone(); } Poly::~Poly() { delete position; delete rotation; delete color; + delete normal; } /* @@ -121,22 +131,40 @@ void Poly::draw() { unsigned int vcount = initpoints.size(); + //save camera position + glPushMatrix(); + + //center poly + glTranslatef(-position->x(), -position->y(), -position->z()); + + //rotate poly + glRotatef(rotation->x(), 1.0f, 0.0f, 0.0f); + glRotatef(rotation->y(), 0.0f, 1.0f, 0.0f); + glRotatef(rotation->z(), 0.0f, 0.0f, 1.0f); + glBegin (GL_POLYGON); for ( std::vector::size_type i = 0; i < vcount; i++ ) { - Vec cur = rotate_xyz(*initpoints.at(i) - *position); - //normal - Vec prev = rotate_xyz(*initpoints.at((i-1+vcount)%vcount) - *position); - Vec next = rotate_xyz(*initpoints.at((i+1) % vcount) - *position); - prev = prev - cur; - next = next - cur; - glNormal3fv(prev.cross(next).normalize().c); + /* old version + Vec cur = rotate_xyz(*initpoints.at(i) - *position); - color->drawColor(); - glVertex3fv((*position + cur).c); + //normal + Vec prev = rotate_xyz(*initpoints.at((i-1+vcount)%vcount) - *position); + Vec next = rotate_xyz(*initpoints.at((i+1) % vcount) - *position); + prev = prev - cur; + next = next - cur; + */ + + glNormal3fv(normal->c); + color->drawColor(); + //glVertex3fv((*position + cur).c); + glVertex3fv((*initpoints.at(i) - *position).c); } glEnd(); + + //restore camera position + glPopMatrix(); } int Poly::numPoints() {