From: APL <> Date: Fri, 10 Feb 2012 09:30:38 +0000 (+0000) Subject: 0022683: Incorrect result of Select3D_Projector::Project() in the case of perspective... X-Git-Tag: V6_5_3_beta1~109 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=b0f0bd0c2fc625172be48b7b4c97adbd08d3e69f 0022683: Incorrect result of Select3D_Projector::Project() in the case of perspective projection --- diff --git a/src/Select3D/Select3D_Projector.cdl b/src/Select3D/Select3D_Projector.cdl index 142c5c91e9..d24a8c9eef 100755 --- a/src/Select3D/Select3D_Projector.cdl +++ b/src/Select3D/Select3D_Projector.cdl @@ -6,6 +6,21 @@ class Projector from Select3D inherits Transient from Standard ---Purpose: A framework to define 3D projectors. + -- Projector provides services for projecting points from + -- world-coordinates to a viewing plane. Projection could be defined by + -- corresponding transformation, or coordinate system. The transformation + -- could be constructed for a view with transposed view transformation + -- matrix ( that represents view-orientation ), including, for perspective + -- view, focal distance ( distance from an eye to the view plane ) and + -- translational part that represents translation of focal point in + -- view-coordinate space. The Select3D_Projector class recognizes the + -- predefined set of popular projections: axonometric, top view, front + -- view and uses more efficient algorithm for projection computations. + -- User-defined transformation could be also defined in constructor. + -- Perspective projection consists of two separate parts, that are + -- composed together during computation: transformation component and + -- focale distance. + uses Real from Standard, Boolean from Standard, @@ -30,33 +45,57 @@ is Create returns Projector from Select3D; Create(CS : Ax2 from gp) - ---Purpose: Creates an axonometric projector. is the - -- viewing coordinate system. + ---Purpose: Creates an axonometric projector. represents viewing coordinate + -- system and could be constructed from x direction, view plane normal direction, + -- and view point location in world-coordinate space. returns Projector from Select3D; Create(CS : Ax2 from gp; Focus : Real from Standard) - ---Purpose: Creates a perspective projector. is the - -- viewing coordinate system. + ---Purpose: Creates a perspective projector. represents viewing + -- coordinate system and could be constructed from x direction, + -- view plane normal direction, and focal point location in world-coordinate + -- space. should represent distance of an eye from view plane + -- in world-coordinate space (focal distance). returns Projector from Select3D; Create(T : Trsf from gp; Persp : Boolean from Standard; Focus : Real from Standard) - ---Purpose: build a Projector with automatic minmax directions. - returns Projector from Select3D; - - Create(T : Trsf from gp; - Persp : Boolean from Standard; - Focus : Real from Standard; - v1,v2,v3 : Vec2d from gp) - ---Purpose: build a Projector with given minmax directions. + ---Purpose: build a Projector from the given transformation. + -- In case, when transformation should represent custom view projection, + -- it could be constructed from two separate components: transposed view + -- orientation matrix and translation of focal point in view-coordiante + -- system. could be built up from x direction, up direction, + -- view plane normal direction vectors and translation with SetValues(...) + -- method, where first row arguments (a11, a12, a13, a14) are x, y, z + -- component of x direction vector, and x value of reversed translation + -- vector. Second row arguments, are x y z for up direction and y value of + -- reversed translation, and the third row defined in the same manner. + -- This also suits for simple perspective view, where is the focale + -- distance of an eye from view plane in world-space coordiantes. + -- Note, that in that case amount of perspective distortion (perspective + -- angle) should be defined through focal distance. returns Projector from Select3D; Create(GT : GTrsf from gp; Persp : Boolean from Standard; Focus : Real from Standard) - ---Purpose: build a Projector with automatic minmax directions. + ---Purpose: build a Projector from the given transformation. + -- In case, when transformation should represent custom view + -- projection, it could be constructed from two separate components: + -- transposed view orientation matrix and translation of a focal point + -- in view-coordinate system. + -- This also suits for perspective view, with that could be + -- equal to distance from an eye to a view plane in + -- world-coordinates (focal distance). + -- The 3x3 transformation matrix is built up from three vectors: + -- x direction, up direction and view plane normal vectors, where each + -- vector is a matrix row. Then is constructed from matrix and + -- reversed translation with methods SetTranslationPart(..) and + -- SetVectorialPart(..). + -- Note, that in that case amount of perspective distortion (perspective + -- angle) should be defined through focal distance. returns Projector from Select3D; Set (me : mutable; @@ -65,7 +104,6 @@ is Focus : Real from Standard) is static; - SetView(me : mutable; V : View from V3d); ---Purpose: Sets the 3D view V used at the time of construction. @@ -74,11 +112,6 @@ is ---C++: return const& ---C++: inline - - Directions(me; D1 , D2 , D3 : out Vec2d from gp) - ---C++: inline - is virtual; - Scaled(me : mutable; On : Boolean from Standard = Standard_False) ---Purpose: to compute with the given scale and translation. is virtual; @@ -138,11 +171,6 @@ is ---Purpose: Transform and apply perspective if needed. is virtual; - BoxAdd(me; P : Pnt2d from gp; - B : out Box from Bnd) - ---Purpose: Adds to the box the min-max of the point

. - is virtual; - Shoot(me; X , Y : Real from Standard) returns Lin from gp ---Purpose: return a line going through the eye towards the @@ -166,9 +194,6 @@ is --- projection functionality itself). --- Should be used when call ::Shoot() to compute eyeline. - SetDirection(me : mutable) - is static private; - Transform(me; P : in out Pnt from gp; T : GTrsf from gp) ---C++: inline @@ -187,9 +212,6 @@ fields myScaledTrsf : Trsf from gp is protected; myGTrsf : GTrsf from gp is protected; myInvTrsf : GTrsf from gp is protected; - myD1 : Vec2d from gp is protected; - myD2 : Vec2d from gp is protected; - myD3 : Vec2d from gp is protected; myView : View from V3d; myDepthMin : Real from Standard; diff --git a/src/Select3D/Select3D_Projector.cxx b/src/Select3D/Select3D_Projector.cxx index 53770f1219..bf5da858f2 100755 --- a/src/Select3D/Select3D_Projector.cxx +++ b/src/Select3D/Select3D_Projector.cxx @@ -28,9 +28,6 @@ Select3D_Projector::Select3D_Projector(const Handle(V3d_View)& aViou) : myPersp(aViou->Type()==V3d_PERSPECTIVE), myFocus(aViou->Focale()), - myD1(1,0), - myD2(0,1), - myD3(1,1), myView(aViou), myDepthMin(-Precision::Infinite()), myDepthMax( Precision::Infinite()) @@ -60,14 +57,10 @@ Select3D_Projector::Select3D_Projector(const Handle(V3d_View)& aViou) Select3D_Projector::Select3D_Projector() : myPersp(Standard_False), myFocus(0), - myD1(1,0), - myD2(0,1), - myD3(1,1), myDepthMin(-Precision::Infinite()), myDepthMax( Precision::Infinite()) { Scaled(); - SetDirection(); } //======================================================================= @@ -84,7 +77,6 @@ Select3D_Projector::Select3D_Projector (const gp_Ax2& CS) myScaledTrsf.SetTransformation(CS); myGTrsf.SetTrsf(myScaledTrsf); Scaled(); - SetDirection(); } //======================================================================= @@ -102,7 +94,6 @@ Select3D_Projector::Select3D_Projector (const gp_Ax2& CS, myScaledTrsf.SetTransformation(CS); myGTrsf.SetTrsf(myScaledTrsf); Scaled(); - SetDirection(); } //======================================================================= @@ -118,31 +109,6 @@ Select3D_Projector::Select3D_Projector (const gp_Trsf& T, myScaledTrsf(T), myDepthMin(-Precision::Infinite()), myDepthMax( Precision::Infinite()) -{ - myGTrsf.SetTrsf(myScaledTrsf); - Scaled(); - SetDirection(); -} - -//======================================================================= -//function : Select3D_Projector -//purpose : -//======================================================================= - -Select3D_Projector::Select3D_Projector (const gp_Trsf& T, - const Standard_Boolean Persp, - const Standard_Real Focus, - const gp_Vec2d& v1, - const gp_Vec2d& v2, - const gp_Vec2d& v3) -: myPersp(Persp), - myFocus(Focus), - myScaledTrsf(T), - myD1(v1), - myD2(v2), - myD3(v3), - myDepthMin(-Precision::Infinite()), - myDepthMax( Precision::Infinite()) { myGTrsf.SetTrsf(myScaledTrsf); Scaled(); @@ -163,7 +129,6 @@ Select3D_Projector::Select3D_Projector (const gp_GTrsf& GT, myDepthMax( Precision::Infinite()) { Scaled(); - SetDirection(); } //======================================================================= @@ -180,7 +145,6 @@ void Select3D_Projector::Set myFocus = Focus; myScaledTrsf = T; Scaled(); - SetDirection(); } //======================================================================= @@ -438,19 +402,6 @@ void Select3D_Projector::Project (const gp_Pnt& P, } } -//======================================================================= -//function : BoxAdd -//purpose : -//======================================================================= - -void Select3D_Projector::BoxAdd - (const gp_Pnt2d& P, - Bnd_Box& B) const -{ - gp_Vec2d V(P.X(),P.Y()); - gp_Pnt PP(myD1 * V, myD2 * V, myD3 * V); - B.Add(PP); -} //======================================================================= //function : Shoot @@ -476,30 +427,6 @@ gp_Lin Select3D_Projector::Shoot } -//======================================================================= -//function : SetDirection -//purpose : -//======================================================================= - -void Select3D_Projector::SetDirection () -{ - gp_Vec V1(1,0,0); - Transform(V1); - if ((Abs(V1.X()) + Abs(V1.Y())) < Precision::Angular()) V1.SetCoord(1,1,0); - gp_Vec2d D1(V1.X(),V1.Y()); - myD1.SetCoord(-D1.Y(),D1.X()); - gp_Vec V2(0,1,0); - Transform(V2); - if ((Abs(V2.X()) + Abs(V2.Y())) < Precision::Angular()) V2.SetCoord(1,1,0); - gp_Vec2d D2(V2.X(),V2.Y()); - myD2.SetCoord(-D2.Y(),D2.X()); - gp_Vec V3(0,0,1); - Transform(V3); - if ((Abs(V3.X()) + Abs(V3.Y())) < Precision::Angular()) V3.SetCoord(1,1,0); - gp_Vec2d D3(V3.X(),V3.Y()); - myD3.SetCoord(-D3.Y(),D3.X()); -} - void Select3D_Projector::SetView(const Handle(V3d_View)& aViou) { myView = aViou; diff --git a/src/Select3D/Select3D_Projector.lxx b/src/Select3D/Select3D_Projector.lxx index b929f48367..33617d51a1 100755 --- a/src/Select3D/Select3D_Projector.lxx +++ b/src/Select3D/Select3D_Projector.lxx @@ -10,19 +10,6 @@ #include #include -//======================================================================= -//function : Directions -//purpose : -//======================================================================= - -inline void Select3D_Projector::Directions - (gp_Vec2d& D1, gp_Vec2d& D2, gp_Vec2d& D3) const -{ - D1 = myD1; - D2 = myD2; - D3 = myD3; -} - //======================================================================= //function : Perspective //purpose :