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