void Shape::axisRotate(float deg){ Vertex centTemp(center.x, center.y, center.z); translate(-center.x, -center.y, -center.z);//Translate to origin Vertex origin(0,0,0); bool para = false; //Build movement matrix axis = chooseAxis(); Vect * ax = new Vect(origin, axis); Vect y(0,1.0, 0); Vect * v = Vect::unitVector(*ax); if(v->isParallel(y)){ v->x += .0000000001; } Vect * u = Vect::unitVector(*(Vect::crossProduct(*v, y))); Vect * n = Vect::unitVector(*(Vect::crossProduct(*u, *v))); //Align the global axis to the local axis: for(int i = 0; i < rs; i++){ for(int j = 0; j < vs; j++){ GLfloat x = verts[i][j].x; GLfloat y = verts[i][j].y; GLfloat z = verts[i][j].z; verts[i][j].x = u->x*x + u->y*y + u->z*z; verts[i][j].y = v->x*x + v->y*y + v->z*z; verts[i][j].z = n->x*x + n->y*y + n->z*z; x = vertsNorm[i][j].x; y = vertsNorm[i][j].y; z = vertsNorm[i][j].z; vertsNorm[i][j].x = u->x*x + u->y*y + u->z*z; vertsNorm[i][j].y = v->x*x + v->y*y + v->z*z; vertsNorm[i][j].z = n->x*x + n->y*y + n->z*z; } } //Rotate the amount needed. rotate(deg, 0, 1, 0); if(!para){ for(int i = 0; i < rs; i++){ for(int j = 0; j < vs; j++){ GLfloat x = verts[i][j].x; GLfloat y = verts[i][j].y; GLfloat z = verts[i][j].z; verts[i][j].x = u->x*x + v->x*y + n->x*z; verts[i][j].y = u->y*x + v->y*y + n->y*z; verts[i][j].z = u->z*x + v->z*y + n->z*z; x = vertsNorm[i][j].x; y = vertsNorm[i][j].y; z = vertsNorm[i][j].z; vertsNorm[i][j].x = u->x*x + v->x*y + n->x*z; vertsNorm[i][j].y = u->y*x + v->y*y + n->y*z; vertsNorm[i][j].z = u->z*x + v->z*y + n->z*z; } } } translate(centTemp.x, centTemp.y, centTemp.z); }