From fb85c92dd0a4fbc2c49bd4a699e2027f320d7346 Mon Sep 17 00:00:00 2001 From: Bas Ruigrok Date: Sat, 11 Jan 2025 13:49:45 +0100 Subject: [PATCH] Gui: Fix camera position shift when starting rotation --- src/Gui/NavigationStyle.cpp | 45 +++++++------------------------------ 1 file changed, 8 insertions(+), 37 deletions(-) diff --git a/src/Gui/NavigationStyle.cpp b/src/Gui/NavigationStyle.cpp index 406c58357f..f8397773f8 100644 --- a/src/Gui/NavigationStyle.cpp +++ b/src/Gui/NavigationStyle.cpp @@ -895,15 +895,6 @@ void NavigationStyle::spin(const SbVec2f & pointerpos) spinprojector->setSphere(SbSphere {SbVec3f {0, 0, 0}, FCSphereSheetProjector::defaultSphereRadius}); } - if (this->rotationCenterMode && this->rotationCenterFound) { - SbVec3f hitpoint = this->rotationCenter; - - // set to the given position - SbVec3f direction; - viewer->getSoRenderManager()->getCamera()->orientation.getValue().multVec(SbVec3f(0, 0, -1), direction); - viewer->getSoRenderManager()->getCamera()->position = hitpoint - viewer->getSoRenderManager()->getCamera()->focalDistance.getValue() * direction; - } - // 0000333: Turntable camera rotation SbMatrix mat; viewer->getSoRenderManager()->getCamera()->orientation.getValue().getValue(mat); @@ -920,16 +911,12 @@ void NavigationStyle::spin(const SbVec2f & pointerpos) r.setValue(axis, radians); } r.invert(); - this->reorientCamera(viewer->getSoRenderManager()->getCamera(), r); if (this->rotationCenterMode && this->rotationCenterFound) { - float ratio = vp.getViewportAspectRatio(); - SbViewVolume vv = viewer->getSoRenderManager()->getCamera()->getViewVolume(vp.getViewportAspectRatio()); - SbPlane panplane = vv.getPlane(viewer->getSoRenderManager()->getCamera()->focalDistance.getValue()); - SbVec2f posn; - posn[0] = float(this->localPos[0]) / float(std::max((int)(glsize[0]-1), 1)); - posn[1] = float(this->localPos[1]) / float(std::max((int)(glsize[1]-1), 1)); - panCamera(viewer->getSoRenderManager()->getCamera(), ratio, panplane, posn, SbVec2f(0.5,0.5)); + this->reorientCamera(viewer->getSoRenderManager()->getCamera(), r, rotationCenter); + } + else { + this->reorientCamera(viewer->getSoRenderManager()->getCamera(), r); } // Calculate an average angle magnitude value to make the transition @@ -971,15 +958,6 @@ void NavigationStyle::spin_simplified(SoCamera* cam, SbVec2f curpos, SbVec2f pre { assert(this->spinprojector); - if (this->rotationCenterMode && this->rotationCenterFound) { - SbVec3f hitpoint = this->rotationCenter; - - // set to the given position - SbVec3f direction; - viewer->getSoRenderManager()->getCamera()->orientation.getValue().multVec(SbVec3f(0, 0, -1), direction); - viewer->getSoRenderManager()->getCamera()->position = hitpoint - viewer->getSoRenderManager()->getCamera()->focalDistance.getValue() * direction; - } - // 0000333: Turntable camera rotation SbMatrix mat; viewer->getSoRenderManager()->getCamera()->orientation.getValue().getValue(mat); @@ -997,19 +975,12 @@ void NavigationStyle::spin_simplified(SoCamera* cam, SbVec2f curpos, SbVec2f pre r.setValue(axis, radians); } r.invert(); - this->reorientCamera(cam, r); if (this->rotationCenterMode && this->rotationCenterFound) { - const SbViewportRegion & vp = viewer->getSoRenderManager()->getViewportRegion(); - SbVec2s glsize(vp.getViewportSizePixels()); - - float ratio = vp.getViewportAspectRatio(); - SbViewVolume vv = viewer->getSoRenderManager()->getCamera()->getViewVolume(vp.getViewportAspectRatio()); - SbPlane panplane = vv.getPlane(viewer->getSoRenderManager()->getCamera()->focalDistance.getValue()); - SbVec2f posn; - posn[0] = float(this->localPos[0]) / float(std::max((int)(glsize[0]-1), 1)); - posn[1] = float(this->localPos[1]) / float(std::max((int)(glsize[1]-1), 1)); - panCamera(viewer->getSoRenderManager()->getCamera(), ratio, panplane, posn, SbVec2f(0.5,0.5)); + this->reorientCamera(viewer->getSoRenderManager()->getCamera(), r, rotationCenter); + } + else { + this->reorientCamera(viewer->getSoRenderManager()->getCamera(), r); } hasDragged = true;