guille

07-25-2001, 11:41 PM

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)).

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)).