// get the eye and the target points
V3d_Coordinate theXEye, theYEye, theZEye, theXAt, theYAt, theZAt;
aView->Eye(theXEye, theYEye, theZEye);
aView->At(theXAt, theYAt, theZAt);
gp_Pnt theEyePoint(theXEye, theYEye, theZEye);
gp_Pnt theAtPoint(theXAt, theYAt, theZAt);
// create the direction
gp_Vec theEyeVector(theEyePoint, theAtPoint);
gp_Dir theEyeDir(theEyeVector);
// make a plane perpendicular to this direction
gp_Pln thePlaneOfTheView = gp_Pln(theAtPoint, theEyeDir);
// convert the 2d point into 3d
Standard_Real theX, theY, theZ;
aView->Convert(aX2d, aY2d, theX, theY, theZ);
gp_Pnt theConvertedPoint(theX, theY, theZ);
// project the converted point to the plane
gp_Pnt2d theConvertedPointOnPlane = ProjLib::Project(thePlaneOfTheView, theConvertedPoint);
// get the 3d point of this 2d point
gp_Pnt theResultPoint = ElSLib::Value(theConvertedPointOnPlane.X(), theConvertedPointOnPlane.Y(), thePlaneOfTheView);
a3dPoint = theResultPoint;
return Standard_True;
}
ProjLib::Project(thePlaneOfTheView, theConvertedPoint);
Project the converted point on thePlaneOfTheView
ElSLib::Value(theConvertedPointOnPlane.X(), theConvertedPointOnPlane.Y(), thePlaneOfTheView);
Convert the 2d point in the space of thePlaneOfTheView into 3d space coordinates
When I use this routine to display the current 3D position corresponding to the mouse cursor while rotating, it messes the rotation(buggy).
I use routines V3d_View::StartRotation() and V3d_View::Rotation().
I took a look at the source code and realized that calling V3d_View::Eye() modifies some global variables defined as static in V3d_View.cxx (in particular the variable MyViewReferencePoint).
So use V3d_View::Eye() with care.
I modified stephane's code to avoid calling V3d_View::Eye(). To build the view plane, I rather use the projection orientation :
// Make a plane perpendicular to the projection orientation.
Standard_Real x_ori, y_ori, z_ori;
view->Proj (x_ori, y_ori, z_ori);
gp_Dir proj_orientation (x_ori, y_ori, z_ori);
gp_Pln view_plane = gp_Pln (gp_Pnt (0, 0, 0), proj_orientation);
// Convert the 2d point into a 3d point.
Standard_Real xp, yp, zp;
view->Convert (x, y, xp, yp, zp);
gp_Pnt converted_pnt (xp, yp, zp);
// Project the converted point in the plane.
gp_Pnt2d projected_pnt = ProjLib::Project (view_plane, converted_pnt);
// Get a 3d point from this 2d point.
return ElSLib::Value (projected_pnt.X (), projected_pnt.Y (), view_plane);
}
Hi, Dear Stephane , Could you tell me how can I confine the mouse movement in one plane(such as in a Face of TopoDS_Shape) in a 3D view? And unfortunately your website www.exotk.org is unaccessible for me. Is all the infomation of this site is available in sourceforge.net/projects/exotk?
why why why i get wrong results when i to convert mouse coordinates to world coordinates when the view is 3d , but when the view is plane it gives true coordinates?
Thu, 04/04/2002 - 16:48
Hi,
I've done a function a long time ago to do what you want.
HTH,
Stephane
http://www.exotk.org
Standard_Boolean exotkUtils_View::Convert2dPntTo3dPnt(const Handle_V3d_View& aView, const Standard_Integer aX2d, const Standard_Integer aY2d, gp_Pnt& a3dPoint)
{
if (aView.IsNull())
return Standard_False;
// get the eye and the target points
V3d_Coordinate theXEye, theYEye, theZEye, theXAt, theYAt, theZAt;
aView->Eye(theXEye, theYEye, theZEye);
aView->At(theXAt, theYAt, theZAt);
gp_Pnt theEyePoint(theXEye, theYEye, theZEye);
gp_Pnt theAtPoint(theXAt, theYAt, theZAt);
// create the direction
gp_Vec theEyeVector(theEyePoint, theAtPoint);
gp_Dir theEyeDir(theEyeVector);
// make a plane perpendicular to this direction
gp_Pln thePlaneOfTheView = gp_Pln(theAtPoint, theEyeDir);
// convert the 2d point into 3d
Standard_Real theX, theY, theZ;
aView->Convert(aX2d, aY2d, theX, theY, theZ);
gp_Pnt theConvertedPoint(theX, theY, theZ);
// project the converted point to the plane
gp_Pnt2d theConvertedPointOnPlane = ProjLib::Project(thePlaneOfTheView, theConvertedPoint);
// get the 3d point of this 2d point
gp_Pnt theResultPoint = ElSLib::Value(theConvertedPointOnPlane.X(), theConvertedPointOnPlane.Y(), thePlaneOfTheView);
a3dPoint = theResultPoint;
return Standard_True;
}
Stephane
http://www.exotk.org
Fri, 04/05/2002 - 07:13
Thank you.
But,
what is the followings?
ProjLib::Project(thePlaneOfTheView, theConvertedPoint);
ElSLib::Value(theConvertedPointOnPlane.X(), theConvertedPointOnPlane.Y(), thePlaneOfTheView);
Fri, 04/05/2002 - 16:24
ProjLib::Project(thePlaneOfTheView, theConvertedPoint);
Project the converted point on thePlaneOfTheView
ElSLib::Value(theConvertedPointOnPlane.X(), theConvertedPointOnPlane.Y(), thePlaneOfTheView);
Convert the 2d point in the space of thePlaneOfTheView into 3d space coordinates
Stephane
http://www.exotk.org
Mon, 08/16/2004 - 08:58
ProjLib::Project is not valid , can I have the new code
Wed, 03/08/2006 - 15:11
Hi,
When I use this routine to display the current 3D position corresponding to the mouse cursor while rotating, it messes the rotation(buggy).
I use routines V3d_View::StartRotation() and V3d_View::Rotation().
I took a look at the source code and realized that calling V3d_View::Eye() modifies some global variables defined as static in V3d_View.cxx (in particular the variable MyViewReferencePoint).
So use V3d_View::Eye() with care.
I modified stephane's code to avoid calling V3d_View::Eye(). To build the view plane, I rather use the projection orientation :
gp_Pnt to_3d_point (const Handle_V3d_View& view, Standard_Integer y, Standard_Integer y)
{
assert (!view.IsNull ());//view_not_null
// Make a plane perpendicular to the projection orientation.
Standard_Real x_ori, y_ori, z_ori;
view->Proj (x_ori, y_ori, z_ori);
gp_Dir proj_orientation (x_ori, y_ori, z_ori);
gp_Pln view_plane = gp_Pln (gp_Pnt (0, 0, 0), proj_orientation);
// Convert the 2d point into a 3d point.
Standard_Real xp, yp, zp;
view->Convert (x, y, xp, yp, zp);
gp_Pnt converted_pnt (xp, yp, zp);
// Project the converted point in the plane.
gp_Pnt2d projected_pnt = ProjLib::Project (view_plane, converted_pnt);
// Get a 3d point from this 2d point.
return ElSLib::Value (projected_pnt.X (), projected_pnt.Y (), view_plane);
}
Mon, 04/15/2002 - 09:15
Hi, Dear Stephane , Could you tell me how can I confine the mouse movement in one plane(such as in a Face of TopoDS_Shape) in a 3D view? And unfortunately your website www.exotk.org is unaccessible for me. Is all the infomation of this site is available in sourceforge.net/projects/exotk?
Tue, 03/07/2006 - 16:09
Hi,
i use the method given by Stephane but there is still a deviation.
Have you got one?
Thu, 03/05/2020 - 14:13
why why why i get wrong results when i to convert mouse coordinates to world coordinates when the view is 3d , but when the view is plane it gives true coordinates?