X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Fswt%2FvtkCameraAndSelectorAction.java;h=7a0cc0314d228a793e73ce3b2c49fe6c70e425da;hb=refs%2Fchanges%2F54%2F3954%2F1;hp=ebdfb245219a43990271074a2d8f253ffdf774cf;hpb=4ff29034895671ae5375c85bdb86184e06396844;p=simantics%2F3d.git diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/vtkCameraAndSelectorAction.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/vtkCameraAndSelectorAction.java index ebdfb245..7a0cc031 100644 --- a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/vtkCameraAndSelectorAction.java +++ b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/vtkCameraAndSelectorAction.java @@ -118,10 +118,10 @@ public class vtkCameraAndSelectorAction extends vtkSwtAction implements ISelecti int y = e.getY(); // rotate if (this.InteractionMode == 1) { - cam.Azimuth(lastX - x); - cam.Elevation(y - lastY); + cam.Elevation(clampElevationDelta(y - lastY)); if (doNotRotate) cam.SetViewUp(upDirection); + cam.Azimuth(lastX - x); cam.OrthogonalizeViewUp(); resetCameraClippingRange(); // panel.UpdateLight(); @@ -184,6 +184,25 @@ public class vtkCameraAndSelectorAction extends vtkSwtAction implements ISelecti return true; } + private static double dot(double[] a, double[] b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + + /** Calculate change in elevation, clamped to vertical directions. */ + private double clampElevationDelta(double elevationDelta) { + if (!doNotRotate) + return elevationDelta; + + double[] direction = cam.GetDirectionOfProjection(); + double d = Math.min(1.0, Math.max(-1.0, dot(direction, upDirection))); + double elevation = Math.toDegrees(Math.acos(d)) + elevationDelta; + if (elevation < 0) + elevationDelta -= elevation - 1e-5; + else if (elevation > 180) + elevationDelta -= elevation - 180 + 1e-5; + return elevationDelta; + } + @Override public boolean mouseWheelMoved(MouseWheelEvent e) { double zoomFactor;