# trackball rotation

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

• Ok, simulate a track-ball. 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 z-coordinates 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.0
TRACKBALLSIZE);

/*

• Avoid problems with out-of-control 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)).