Skip to content

Commit

Permalink
Gui: Fix window center rotation mode and orthographic view clipping
Browse files Browse the repository at this point in the history
  • Loading branch information
Rexbas committed Nov 5, 2023
1 parent 29fbab3 commit 767c52a
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions src/Gui/NavigationStyle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -503,17 +503,37 @@ void NavigationStyle::reorientCamera(SoCamera* camera, const SbRotation& rotatio
// Set new orientation value by accumulating the new rotation
camera->orientation = rotation * camera->orientation.getValue();

// Fix issue with near clipping in orthogonal view
if (camera->getTypeId().isDerivedFrom(SoOrthographicCamera::getClassTypeId())) {
camera->focalDistance = static_cast<SoOrthographicCamera*>(camera)->height;
}

// Distance from rotation center to new camera position in global coordinate system
SbVec3f newRotationCenterDistance;
camera->orientation.getValue().multVec(rotationCenterDistanceCam, newRotationCenterDistance);

// Reposition camera so the rotation center stays in the same place
camera->position = rotationCenter + newRotationCenterDistance;

// Fix issue with near clipping in orthogonal view
if (camera->getTypeId().isDerivedFrom(SoOrthographicCamera::getClassTypeId())) {

// Find a bounding sphere for the scene
SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion());
action.apply(viewer->getSceneGraph());
SbSphere boundingSphere;
boundingSphere.circumscribe(action.getBoundingBox());

// The center of the bounding sphere in camera coordinate system
SbVec3f center;
camera->orientation.getValue().inverse().multVec(boundingSphere.getCenter() - camera->position.getValue(), center);

SbVec3f dir;
camera->orientation.getValue().multVec(SbVec3f(0, 0, -1), dir);

// Reposition the camera but keep the focal point the same
// nearDistance is 0 and farDistance is the diameter of the bounding sphere
float repositionDistance = -center.getValue()[2] - boundingSphere.getRadius();
camera->position = camera->position.getValue() + repositionDistance * dir;
camera->nearDistance = 0;
camera->farDistance = 2 * boundingSphere.getRadius();
camera->focalDistance = camera->focalDistance.getValue() - repositionDistance;
}
}

void NavigationStyle::panCamera(SoCamera * cam, float aspectratio, const SbPlane & panplane,
Expand Down

0 comments on commit 767c52a

Please sign in to comment.