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.0TRACKBALLSIZE);
/*
- 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)).