mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-21 10:13:43 +03:00
0025624: Visualization - selection is incorrect in perspective mode in a specific case
Corrected computation of picking line for perspective camera; Test case for issue 25624.
This commit is contained in:
parent
873c119ff1
commit
42b96b07b5
@ -127,9 +127,13 @@ is
|
|||||||
returns Projector from Select3D;
|
returns Projector from Select3D;
|
||||||
|
|
||||||
Create (theViewTrsf : Mat4d from Graphic3d;
|
Create (theViewTrsf : Mat4d from Graphic3d;
|
||||||
theProjTrsf : Mat4d from Graphic3d)
|
theProjTrsf : Mat4d from Graphic3d;
|
||||||
|
theZNear : Real from Standard = 0.0;
|
||||||
|
theZFar : Real from Standard = 10.0)
|
||||||
---Purpose: Builds the Projector from the passed model-view <theViewTrsf>
|
---Purpose: Builds the Projector from the passed model-view <theViewTrsf>
|
||||||
-- and projection <theProjTrsf> transformation matrices.
|
-- and projection <theProjTrsf> transformation matrices. Parameters <theZNear>
|
||||||
|
-- and <theZFar> are passed to define view frustum depth for further projection
|
||||||
|
-- line computation using perspective projection.
|
||||||
returns Projector from Select3D;
|
returns Projector from Select3D;
|
||||||
|
|
||||||
Set (me : mutable;
|
Set (me : mutable;
|
||||||
@ -140,7 +144,9 @@ is
|
|||||||
|
|
||||||
Set (me : mutable;
|
Set (me : mutable;
|
||||||
theViewTrsf : Mat4d from Graphic3d;
|
theViewTrsf : Mat4d from Graphic3d;
|
||||||
theProjTrsf : Mat4d from Graphic3d);
|
theProjTrsf : Mat4d from Graphic3d;
|
||||||
|
theZNear : Real from Standard;
|
||||||
|
theZFar : Real from Standard);
|
||||||
---Purpose: Sets new parameters for the Projector.
|
---Purpose: Sets new parameters for the Projector.
|
||||||
|
|
||||||
SetView (me : mutable;
|
SetView (me : mutable;
|
||||||
@ -245,5 +251,7 @@ fields
|
|||||||
myInvTrsf : GTrsf from gp is protected;
|
myInvTrsf : GTrsf from gp is protected;
|
||||||
myScaledTrsf : Trsf from gp is protected;
|
myScaledTrsf : Trsf from gp is protected;
|
||||||
myProjTrsf : Mat4d from Graphic3d is protected;
|
myProjTrsf : Mat4d from Graphic3d is protected;
|
||||||
|
myZNear : Real from Standard is protected;
|
||||||
|
myZFar : Real from Standard is protected;
|
||||||
|
|
||||||
end Projector;
|
end Projector;
|
||||||
|
@ -107,6 +107,8 @@ namespace
|
|||||||
Select3D_Projector::Select3D_Projector (const Handle(V3d_View)& theView)
|
Select3D_Projector::Select3D_Projector (const Handle(V3d_View)& theView)
|
||||||
: myPersp (Standard_False),
|
: myPersp (Standard_False),
|
||||||
myFocus (0.0),
|
myFocus (0.0),
|
||||||
|
myZNear (0.0),
|
||||||
|
myZFar (10.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
SetView (theView);
|
SetView (theView);
|
||||||
@ -119,6 +121,8 @@ Select3D_Projector::Select3D_Projector (const Handle(V3d_View)& theView)
|
|||||||
Select3D_Projector::Select3D_Projector()
|
Select3D_Projector::Select3D_Projector()
|
||||||
: myPersp (Standard_False),
|
: myPersp (Standard_False),
|
||||||
myFocus (0.0),
|
myFocus (0.0),
|
||||||
|
myZNear (0.0),
|
||||||
|
myZFar (10.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
Scaled();
|
Scaled();
|
||||||
@ -131,6 +135,8 @@ Select3D_Projector::Select3D_Projector()
|
|||||||
Select3D_Projector::Select3D_Projector (const gp_Ax2& theCS)
|
Select3D_Projector::Select3D_Projector (const gp_Ax2& theCS)
|
||||||
: myPersp (Standard_False),
|
: myPersp (Standard_False),
|
||||||
myFocus (0.0),
|
myFocus (0.0),
|
||||||
|
myZNear (0.0),
|
||||||
|
myZFar (10.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
myScaledTrsf.SetTransformation (theCS);
|
myScaledTrsf.SetTransformation (theCS);
|
||||||
@ -145,6 +151,8 @@ Select3D_Projector::Select3D_Projector (const gp_Ax2& theCS)
|
|||||||
Select3D_Projector::Select3D_Projector (const gp_Ax2& theCS, const Standard_Real theFocus)
|
Select3D_Projector::Select3D_Projector (const gp_Ax2& theCS, const Standard_Real theFocus)
|
||||||
: myPersp (Standard_True),
|
: myPersp (Standard_True),
|
||||||
myFocus (theFocus),
|
myFocus (theFocus),
|
||||||
|
myZNear (0.0),
|
||||||
|
myZFar (10.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
myScaledTrsf.SetTransformation (theCS);
|
myScaledTrsf.SetTransformation (theCS);
|
||||||
@ -163,6 +171,8 @@ Select3D_Projector::Select3D_Projector (const gp_Trsf& theViewTrsf,
|
|||||||
myFocus (theFocus),
|
myFocus (theFocus),
|
||||||
myGTrsf (theViewTrsf),
|
myGTrsf (theViewTrsf),
|
||||||
myScaledTrsf (theViewTrsf),
|
myScaledTrsf (theViewTrsf),
|
||||||
|
myZNear (0.0),
|
||||||
|
myZFar (10.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
Scaled();
|
Scaled();
|
||||||
@ -179,6 +189,8 @@ Select3D_Projector::Select3D_Projector (const gp_GTrsf& theViewTrsf,
|
|||||||
myFocus (theFocus),
|
myFocus (theFocus),
|
||||||
myGTrsf (theViewTrsf),
|
myGTrsf (theViewTrsf),
|
||||||
myScaledTrsf (theViewTrsf.Trsf()),
|
myScaledTrsf (theViewTrsf.Trsf()),
|
||||||
|
myZNear (0.0),
|
||||||
|
myZFar (10.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
Scaled();
|
Scaled();
|
||||||
@ -189,12 +201,14 @@ Select3D_Projector::Select3D_Projector (const gp_GTrsf& theViewTrsf,
|
|||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
Select3D_Projector::Select3D_Projector (const Graphic3d_Mat4d& theViewTrsf,
|
Select3D_Projector::Select3D_Projector (const Graphic3d_Mat4d& theViewTrsf,
|
||||||
const Graphic3d_Mat4d& theProjTrsf)
|
const Graphic3d_Mat4d& theProjTrsf,
|
||||||
|
const Standard_Real theZNear,
|
||||||
|
const Standard_Real theZFar)
|
||||||
: myPersp (Standard_False),
|
: myPersp (Standard_False),
|
||||||
myFocus (0.0),
|
myFocus (0.0),
|
||||||
myType (-1)
|
myType (-1)
|
||||||
{
|
{
|
||||||
Set (theViewTrsf, theProjTrsf);
|
Set (theViewTrsf, theProjTrsf, theZNear, theZFar);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -217,7 +231,9 @@ void Select3D_Projector::Set (const gp_Trsf& theViewTrsf,
|
|||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void Select3D_Projector::Set (const Graphic3d_Mat4d& theViewTrsf,
|
void Select3D_Projector::Set (const Graphic3d_Mat4d& theViewTrsf,
|
||||||
const Graphic3d_Mat4d& theProjTrsf)
|
const Graphic3d_Mat4d& theProjTrsf,
|
||||||
|
const Standard_Real theZNear,
|
||||||
|
const Standard_Real theZFar)
|
||||||
{
|
{
|
||||||
// Copy elements corresponding to common view-transformation
|
// Copy elements corresponding to common view-transformation
|
||||||
for (Standard_Integer aRowIt = 0; aRowIt < 3; ++aRowIt)
|
for (Standard_Integer aRowIt = 0; aRowIt < 3; ++aRowIt)
|
||||||
@ -239,6 +255,8 @@ void Select3D_Projector::Set (const Graphic3d_Mat4d& theViewTrsf,
|
|||||||
myPersp = Standard_False;
|
myPersp = Standard_False;
|
||||||
myFocus = 0.0;
|
myFocus = 0.0;
|
||||||
myProjTrsf = theProjTrsf;
|
myProjTrsf = theProjTrsf;
|
||||||
|
myZNear = theZNear;
|
||||||
|
myZFar = theZFar;
|
||||||
Scaled();
|
Scaled();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,7 +276,10 @@ void Select3D_Projector::SetView (const Handle(V3d_View)& theView)
|
|||||||
aScale.ChangeValue (2, 2) = aFrameScale.Z();
|
aScale.ChangeValue (2, 2) = aFrameScale.Z();
|
||||||
Graphic3d_Mat4d aScaledProjTrsf = aScale * aProjTrsf;
|
Graphic3d_Mat4d aScaledProjTrsf = aScale * aProjTrsf;
|
||||||
|
|
||||||
Set (aViewTrsf, aScaledProjTrsf);
|
Set (aViewTrsf,
|
||||||
|
aScaledProjTrsf,
|
||||||
|
theView->Camera()->ZNear(),
|
||||||
|
theView->Camera()->ZFar());
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -454,8 +475,8 @@ gp_Lin Select3D_Projector::Shoot (const Standard_Real theX, const Standard_Real
|
|||||||
return gp_Lin();
|
return gp_Lin();
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphic3d_Vec4d aVPnt1 = aProjInv * Graphic3d_Vec4d (theX, theY, 0.0, 1.0);
|
Graphic3d_Vec4d aVPnt1 = aProjInv * Graphic3d_Vec4d (theX, theY, myZNear, 1.0);
|
||||||
Graphic3d_Vec4d aVPnt2 = aProjInv * Graphic3d_Vec4d (theX, theY, 10.0, 1.0);
|
Graphic3d_Vec4d aVPnt2 = aProjInv * Graphic3d_Vec4d (theX, theY, myZFar, 1.0);
|
||||||
aVPnt1 /= aVPnt1.w();
|
aVPnt1 /= aVPnt1.w();
|
||||||
aVPnt2 /= aVPnt2.w();
|
aVPnt2 /= aVPnt2.w();
|
||||||
|
|
||||||
|
@ -475,7 +475,10 @@ Standard_Boolean StdSelect_ViewerSelector3d::UpdateProj (const Handle(V3d_View)&
|
|||||||
aScaledProj.ChangeValue (2, 2) = aViewDimensions.Z();
|
aScaledProj.ChangeValue (2, 2) = aViewDimensions.Z();
|
||||||
Graphic3d_Mat4d aScaledProjMatrix = aScaledProj * aProjMatrix;
|
Graphic3d_Mat4d aScaledProjMatrix = aScaledProj * aProjMatrix;
|
||||||
|
|
||||||
myProjector = new Select3D_Projector (aMVMatrix, aScaledProjMatrix);
|
Standard_Real aZNear = theView->Camera()->ZNear();
|
||||||
|
Standard_Real aZFar = theView->Camera()->ZFar();
|
||||||
|
|
||||||
|
myProjector = new Select3D_Projector (aMVMatrix, aScaledProjMatrix, aZNear, aZFar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
29
tests/bugs/vis/bug25624
Normal file
29
tests/bugs/vis/bug25624
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
puts "========"
|
||||||
|
puts "OCC25624"
|
||||||
|
puts "========"
|
||||||
|
puts ""
|
||||||
|
############################################################################
|
||||||
|
puts "Visualization - selection is incorrect in perspective mode in a specific case"
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
pload MODELING VISUALIZATION
|
||||||
|
box a 0.0 0.0 0.0 0.1 0.1 0.1
|
||||||
|
box b 0.0 0.0 0.5 0.1 0.1 0.1
|
||||||
|
box c 0.0 0.0 1.0 0.1 0.1 0.1
|
||||||
|
|
||||||
|
vinit View1
|
||||||
|
vautozfit 1
|
||||||
|
vclear
|
||||||
|
vtop
|
||||||
|
vsetdispmode 0
|
||||||
|
vcamera -persp
|
||||||
|
vdisplay a b c
|
||||||
|
vfit
|
||||||
|
vselect 210 210
|
||||||
|
|
||||||
|
# check if the closest box is selected
|
||||||
|
checkcolor 170 10 0.8 0.8 0.8
|
||||||
|
|
||||||
|
# check if the farthest box is displayed
|
||||||
|
# without any highlighting
|
||||||
|
checkcolor 210 184 1 1 0
|
Loading…
x
Reference in New Issue
Block a user