I need to rotate object around its geometric center (coordinates of which are known: cx,cy and cz). Also, I need to rotate it around axes, which are themselves rotated, since it's a freespace sim. I'm trying to use quaternions, but so far rotation only seems to work in simple cases (i.e. while axes are unrotated), so I need help. I'm using OpenGL and following code:
[code]
//New, rotated axises:
int asize = 1;
double ox_newx = asize*cos(yaw)*cos(roll);
double ox_newy = asize*cos(roll)*sin(yaw);
double ox_newz = -asize*sin(roll);
double oy_newx = -asize*sin(yaw)*cos(pitch);
double oy_newy = asize*cos(yaw)*cos(pitch);;
double oy_newz = asize*sin(pitch);
double oz_newx = -asize*cos(pitch)*sin(roll);
double oz_newy = -asize*sin(pitch);
double oz_newz = asize*cos(pitch)*cos(roll);
//Rotation:
struct QUAT q1 = make_quat(ox_newx,ox_newy,ox_newz,pitch);
struct QUAT q2 = make_quat(oy_newx,oy_newy,oy_newz,roll);
struct QUAT q3 = make_quat(oz_newx,oz_newy,oz_newz,yaw);
struct QUAT res_quat = mul_3_quat(q1,q2,q3);
GLdouble m[4][4];
quat_to_matrix(res_quat,m);
glMultMatrixd(*m);
glTranslatef(-cx, -cy, -cz);
//Rendering:
glCallList(node->user.d);
[/code]
[code]
//New, rotated axises:
int asize = 1;
double ox_newx = asize*cos(yaw)*cos(roll);
double ox_newy = asize*cos(roll)*sin(yaw);
double ox_newz = -asize*sin(roll);
double oy_newx = -asize*sin(yaw)*cos(pitch);
double oy_newy = asize*cos(yaw)*cos(pitch);;
double oy_newz = asize*sin(pitch);
double oz_newx = -asize*cos(pitch)*sin(roll);
double oz_newy = -asize*sin(pitch);
double oz_newz = asize*cos(pitch)*cos(roll);
//Rotation:
struct QUAT q1 = make_quat(ox_newx,ox_newy,ox_newz,pitch);
struct QUAT q2 = make_quat(oy_newx,oy_newy,oy_newz,roll);
struct QUAT q3 = make_quat(oz_newx,oz_newy,oz_newz,yaw);
struct QUAT res_quat = mul_3_quat(q1,q2,q3);
GLdouble m[4][4];
quat_to_matrix(res_quat,m);
glMultMatrixd(*m);
glTranslatef(-cx, -cy, -cz);
//Rendering:
glCallList(node->user.d);
[/code]