Пример #1
0
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);
}