# PointOnUnitSphere for Virtual Sphere question

I am using a virtual sphere controller for an application rendering a globe. When using an orthogonal projection, I am able to grab a point on the globe and have it track with the mouse very tightly. When using a perspective projection, the point on the globe gets away from the cursor. I feel this is because my pointOnUnitSphere assumes an orthogonal projection. How would I go about using a perspective projection?

Here is the code I am using
P is a ground point, center is always 0,0,0 and radius is just the size of the virtual sphere I am using, in this case the radius of the globe.

private void pointOnUnitSphere(Point3d p, Vector3d v) {
double vx = (p.getX() - this.center.getX()) / this.radius;
double vy = (p.getY() - this.center.getY()) / this.radius;

``````    double lengthSquared = vx * vx + vy * vy;

// Project the point onto the sphere, assuming orthognal projection.
// Points beyond the virtual sphere are normalized onto edge of the sphere (where z = 0)
double vz = 0.0;

if (lengthSquared &lt 1.0)
vz = Math.sqrt(1.0 - lengthSquared);
else {
// past the edge of the sphere. Normalize onto edge of
// the sphere
double length = Math.sqrt(lengthSquared);
vx /= length;
vy /= length;
}

v.setVector(vx, vy, vz);
}``````

do you mean like a virtual trackball? seems like i’ve seen an opengl demo of that somewhere.