Other small improvement to the trackball for the ortographic case
This commit is contained in:
parent
1ff3a301ec
commit
c84d999b4b
|
@ -132,10 +132,10 @@ y = --- * (r^2 /2.0)
|
||||||
@param hit the projection of hitplane on the rotational hyperboloid relative to the manipulator.
|
@param hit the projection of hitplane on the rotational hyperboloid relative to the manipulator.
|
||||||
@return true if and only if hit is valid.
|
@return true if and only if hit is valid.
|
||||||
*/
|
*/
|
||||||
bool HitHyper (Point3f center, float radius, Point3f viewpoint, Plane3f vp,
|
bool HitHyper (Point3f center, float radius, Point3f viewpoint, Plane3f viewplane,
|
||||||
Point3f hitplane, Point3f & hit)
|
Point3f hitOnViewplane, Point3f & hit)
|
||||||
{
|
{
|
||||||
float hitplaney = Distance (center, hitplane);
|
float hitplaney = Distance (center, hitOnViewplane);
|
||||||
float viewpointx = Distance (center, viewpoint);
|
float viewpointx = Distance (center, viewpoint);
|
||||||
|
|
||||||
float a = hitplaney / viewpointx;
|
float a = hitplaney / viewpointx;
|
||||||
|
@ -155,13 +155,43 @@ bool HitHyper (Point3f center, float radius, Point3f viewpoint, Plane3f vp,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Computing the result in 3d space;
|
// Computing the result in 3d space;
|
||||||
Point3f dirRadial = hitplane - center;
|
Point3f dirRadial = hitOnViewplane - center;
|
||||||
dirRadial.Normalize ();
|
dirRadial.Normalize ();
|
||||||
Point3f dirView = vp.Direction ();
|
Point3f dirView = viewplane.Direction ();
|
||||||
dirView.Normalize ();
|
dirView.Normalize ();
|
||||||
hit = center + dirRadial * yval + dirView * xval;
|
hit = center + dirRadial * yval + dirView * xval;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @brief HitHyperOrtho
|
||||||
|
* @param center
|
||||||
|
* @param radius
|
||||||
|
* @param viewpoint
|
||||||
|
* @param viewplane
|
||||||
|
* @param hitOnViewplane
|
||||||
|
* @param hit
|
||||||
|
* @return true if the hit is valid
|
||||||
|
*
|
||||||
|
* Specialized version of the HitHyper();
|
||||||
|
* in the simple ortho case, the hit point is just the value of
|
||||||
|
* y = 1/x * (r^2 /2 ) on the hitOnViewPlane
|
||||||
|
*/
|
||||||
|
bool HitHyperOrtho(Point3f center, float radius, Point3f viewpoint, Plane3f viewplane,
|
||||||
|
Point3f hitOnViewplane, Point3f & hit)
|
||||||
|
{
|
||||||
|
float xval = Distance (center, hitOnViewplane);
|
||||||
|
|
||||||
|
float yval = (1.0 / xval ) * radius * radius / 2.0f;
|
||||||
|
|
||||||
|
// Computing the result in 3d space;
|
||||||
|
Point3f dirRadial = hitOnViewplane - center;
|
||||||
|
dirRadial.Normalize ();
|
||||||
|
Point3f dirView = viewplane.Direction ();
|
||||||
|
dirView.Normalize ();
|
||||||
|
hit = center + dirRadial * xval + dirView * yval;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// nota: non ho scritto io questa funzione,
|
// nota: non ho scritto io questa funzione,
|
||||||
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
||||||
|
@ -198,8 +228,7 @@ Point3f HitSphere (Trackball * tb, const Point3f & p)
|
||||||
hitSphere1(0,0,0),
|
hitSphere1(0,0,0),
|
||||||
hitSphere2(0,0,0),
|
hitSphere2(0,0,0),
|
||||||
hitHyper(0,0,0);
|
hitHyper(0,0,0);
|
||||||
IntersectionPlaneLine < float >(vp, ln, hitPlane);
|
|
||||||
|
|
||||||
Sphere3f sphere (center, tb->radius);//trackball sphere
|
Sphere3f sphere (center, tb->radius);//trackball sphere
|
||||||
bool resSp = IntersectionLineSphere < float >(sphere, ln, hitSphere1, hitSphere2);
|
bool resSp = IntersectionLineSphere < float >(sphere, ln, hitSphere1, hitSphere2);
|
||||||
|
|
||||||
|
@ -212,7 +241,12 @@ Point3f HitSphere (Trackball * tb, const Point3f & p)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*float dl= */ Distance (ln, center);
|
/*float dl= */ Distance (ln, center);
|
||||||
bool resHp = HitHyper (center, tb->radius, viewpoint, vp, hitPlane, hitHyper);
|
bool resHp;
|
||||||
|
IntersectionPlaneLine < float >(vp, ln, hitPlane);
|
||||||
|
if(tb->camera.isOrtho)
|
||||||
|
resHp= HitHyperOrtho (center, tb->radius, viewpoint, vp, hitPlane, hitHyper);
|
||||||
|
else
|
||||||
|
resHp= HitHyper (center, tb->radius, viewpoint, vp, hitPlane, hitHyper);
|
||||||
|
|
||||||
// four cases
|
// four cases
|
||||||
|
|
||||||
|
@ -230,7 +264,7 @@ Point3f HitSphere (Trackball * tb, const Point3f & p)
|
||||||
// 4) line cross both sphere and hyperboloid: choose according angle.
|
// 4) line cross both sphere and hyperboloid: choose according angle.
|
||||||
float angleDeg = math::ToDeg (Angle ((viewpoint - center), (hitSphere - center)));
|
float angleDeg = math::ToDeg (Angle ((viewpoint - center), (hitSphere - center)));
|
||||||
|
|
||||||
//printf("Angle %f (%5.2f %5.2f %5.2f) (%5.2f %5.2f %5.2f)\n",angleDeg,hitSphere[0],hitSphere[1],hitSphere[2],hitHyper[0],hitHyper[1],hitHyper[2]);
|
// qDebug("Angle %f (%5.2f %5.2f %5.2f) (%5.2f %5.2f %5.2f)",angleDeg,hitSphere[0],hitSphere[1],hitSphere[2],hitHyper[0],hitHyper[1],hitHyper[2]);
|
||||||
if (angleDeg < 45)
|
if (angleDeg < 45)
|
||||||
return hitSphere;
|
return hitSphere;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue