mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-13 14:27:08 +03:00
0002618: Visualization - choose better center of gravity for camera rotation operations
Gravity point set to camera center.
This commit is contained in:
@@ -2167,107 +2167,9 @@ void V3d_View::Gravity (Standard_Real& theX,
|
|||||||
Standard_Real& theY,
|
Standard_Real& theY,
|
||||||
Standard_Real& theZ) const
|
Standard_Real& theZ) const
|
||||||
{
|
{
|
||||||
Graphic3d_MapOfStructure aSetOfStructures;
|
theX = myCamera->Center().X();
|
||||||
myView->DisplayedStructures (aSetOfStructures);
|
theY = myCamera->Center().Y();
|
||||||
|
theZ = myCamera->Center().Z();
|
||||||
Standard_Boolean hasSelection = Standard_False;
|
|
||||||
for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aSetOfStructures);
|
|
||||||
aStructIter.More(); aStructIter.Next())
|
|
||||||
{
|
|
||||||
if (aStructIter.Key()->IsHighlighted()
|
|
||||||
&& aStructIter.Key()->IsVisible())
|
|
||||||
{
|
|
||||||
hasSelection = Standard_True;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Standard_Real Xmin, Ymin, Zmin, Xmax, Ymax, Zmax;
|
|
||||||
Standard_Integer aNbPoints = 0;
|
|
||||||
gp_XYZ aResult (0.0, 0.0, 0.0);
|
|
||||||
for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aSetOfStructures);
|
|
||||||
aStructIter.More(); aStructIter.Next())
|
|
||||||
{
|
|
||||||
const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
|
|
||||||
if (!aStruct->IsVisible()
|
|
||||||
|| aStruct->IsInfinite()
|
|
||||||
|| (hasSelection && !aStruct->IsHighlighted()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Graphic3d_BndBox4f& aBox = aStruct->CStructure()->BoundingBox();
|
|
||||||
if (!aBox.IsValid())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip transformation-persistent objects
|
|
||||||
if (aStruct->TransformPersistence().Flags != Graphic3d_TMF_None)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// use camera projection to find gravity point
|
|
||||||
Xmin = (Standard_Real )aBox.CornerMin().x();
|
|
||||||
Ymin = (Standard_Real )aBox.CornerMin().y();
|
|
||||||
Zmin = (Standard_Real )aBox.CornerMin().z();
|
|
||||||
Xmax = (Standard_Real )aBox.CornerMax().x();
|
|
||||||
Ymax = (Standard_Real )aBox.CornerMax().y();
|
|
||||||
Zmax = (Standard_Real )aBox.CornerMax().z();
|
|
||||||
gp_Pnt aPnts[THE_NB_BOUND_POINTS] =
|
|
||||||
{
|
|
||||||
gp_Pnt (Xmin, Ymin, Zmin), gp_Pnt (Xmin, Ymin, Zmax),
|
|
||||||
gp_Pnt (Xmin, Ymax, Zmin), gp_Pnt (Xmin, Ymax, Zmax),
|
|
||||||
gp_Pnt (Xmax, Ymin, Zmin), gp_Pnt (Xmax, Ymin, Zmax),
|
|
||||||
gp_Pnt (Xmax, Ymax, Zmin), gp_Pnt (Xmax, Ymax, Zmax)
|
|
||||||
};
|
|
||||||
|
|
||||||
for (Standard_Integer aPntIt = 0; aPntIt < THE_NB_BOUND_POINTS; ++aPntIt)
|
|
||||||
{
|
|
||||||
const gp_Pnt& aBndPnt = aPnts[aPntIt];
|
|
||||||
const gp_Pnt aProjected = Camera()->Project (aBndPnt);
|
|
||||||
if (Abs (aProjected.X()) <= 1.0
|
|
||||||
&& Abs (aProjected.Y()) <= 1.0)
|
|
||||||
{
|
|
||||||
aResult += aBndPnt.XYZ();
|
|
||||||
++aNbPoints;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aNbPoints == 0)
|
|
||||||
{
|
|
||||||
// fallback - just use bounding box of entire scene
|
|
||||||
Bnd_Box aBox = myView->MinMaxValues (Standard_True);
|
|
||||||
if (!aBox.IsVoid())
|
|
||||||
{
|
|
||||||
aBox.Get (Xmin, Ymin, Zmin,
|
|
||||||
Xmax, Ymax, Zmax);
|
|
||||||
gp_Pnt aPnts[THE_NB_BOUND_POINTS] =
|
|
||||||
{
|
|
||||||
gp_Pnt (Xmin, Ymin, Zmin), gp_Pnt (Xmin, Ymin, Zmax),
|
|
||||||
gp_Pnt (Xmin, Ymax, Zmin), gp_Pnt (Xmin, Ymax, Zmax),
|
|
||||||
gp_Pnt (Xmax, Ymin, Zmin), gp_Pnt (Xmax, Ymin, Zmax),
|
|
||||||
gp_Pnt (Xmax, Ymax, Zmin), gp_Pnt (Xmax, Ymax, Zmax)
|
|
||||||
};
|
|
||||||
|
|
||||||
for (Standard_Integer aPntIt = 0; aPntIt < THE_NB_BOUND_POINTS; ++aPntIt)
|
|
||||||
{
|
|
||||||
const gp_Pnt& aBndPnt = aPnts[aPntIt];
|
|
||||||
aResult += aBndPnt.XYZ();
|
|
||||||
++aNbPoints;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aNbPoints > 0)
|
|
||||||
{
|
|
||||||
aResult /= aNbPoints;
|
|
||||||
}
|
|
||||||
theX = aResult.X();
|
|
||||||
theY = aResult.Y();
|
|
||||||
theZ = aResult.Z();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
Reference in New Issue
Block a user