From: duv Date: Tue, 10 Mar 2015 12:15:07 +0000 (+0300) Subject: 0002618: Visualization - choose better center of gravity for camera rotation operations X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=bc0ba7506d006d39fb6f5cb79aa67c6e6e13670b;p=occt-copy.git 0002618: Visualization - choose better center of gravity for camera rotation operations Gravity point set to camera center. --- diff --git a/src/V3d/V3d_View.cxx b/src/V3d/V3d_View.cxx index a2ada39917..c72d6d1ca1 100644 --- a/src/V3d/V3d_View.cxx +++ b/src/V3d/V3d_View.cxx @@ -2071,108 +2071,9 @@ void V3d_View::Gravity (Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ) const { - Graphic3d_MapOfStructure aSetOfStructures; - MyView->DisplayedStructures (aSetOfStructures); - - 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() - || (hasSelection && !aStruct->IsHighlighted()) - || aStruct->IsEmpty()) - { - continue; - } - - Bnd_Box aBox = aStruct->MinMaxValues(); - if (aBox.IsVoid() || aStruct->IsInfinite()) - { - continue; - } - - // use camera projection to find gravity point - 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]; - const gp_Pnt aProjected = myCamera->Project (aBndPnt); - if (Abs (aProjected.X()) <= 1.0 - && Abs (aProjected.Y()) <= 1.0) - { - aResult += aBndPnt.XYZ(); - ++aNbPoints; - } - } - } - - if (aNbPoints == 0) - { - for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aSetOfStructures); - aStructIter.More(); aStructIter.Next()) - { - const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key(); - if (aStruct->IsEmpty()) - { - continue; - } - - Bnd_Box aBox = aStruct->MinMaxValues(); - if (aBox.IsVoid() || aStruct->IsInfinite()) - { - continue; - } - - 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(); + theX = myCamera->Center().X(); + theY = myCamera->Center().Y(); + theZ = myCamera->Center().Z(); } //=======================================================================