Hi,
Have you used the trackball rotation?
Here’s a part from the code…
/*

Ok, simulate a trackball. Project the points onto the virtual

trackball, then figure out the axis of rotation, which is the cross

product of P1 P2 and O P1 (O is the center of the ball, 0,0,0)

Note: This is a deformed trackball is a trackball in the center,

but is deformed into a hyperbolic sheet of rotation away from the

center. This particular function was chosen after trying out

several variations.

It is assumed that the arguments to this routine are in the range

(1.0 … 1.0)
/
void
trackball(double q[4], double p1x, double p1y, double p2x, double p2y)
{
double a[3]; / Axis of rotation /
double phi; / how much to rotate about axis */
double p1[3], p2[3], d[3];
double t;if (p1x == p2x && p1y == p2y) {
/* Zero rotation */
vzero(q);
q[3] = 1.0;
return;
}/*
 First, figure out zcoordinates for projection of P1 and P2 to
 deformed sphere
*/
vset(p1,p1x,p1y,tb_project_to_sphere(TRACKBALLSIZE,p1x,p1y));
vset(p2,p2x,p2y,tb_project_to_sphere(TRACKBALLSIZE,p2x,p2y));
/*
 Now, we want the cross product of P1 and P2
*/
vcross(p2,p1,a);
/*
 Figure out how much to rotate around that axis.
/
vsub(p1,p2,d);
t = vlength(d) / (2.0TRACKBALLSIZE);
/*
 Avoid problems with outofcontrol values…
*/
if (t > 1.0) t = 1.0;
if (t < 1.0) t = 1.0;
phi = 2.0 * asin(t);
axis_to_quat(a,phi,q);
}
How can I change the rotation center? (in the code is (0,0,0)).