From: Marko Luukkainen Date: Tue, 5 Nov 2019 17:06:12 +0000 (+0200) Subject: Fix parallel perspective toggle to keep view direction X-Git-Tag: v1.43.0~144 X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=99366a416fcd1e18e0cf54c8efd255abfc8a01f4;p=simantics%2F3d.git Fix parallel perspective toggle to keep view direction gitlab #47 Change-Id: Ie30f8b117c085870703599ebe0a0928f6aa31e7b --- diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java index 70eb3a63..43ec97a0 100644 --- a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java +++ b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java @@ -11,9 +11,6 @@ *******************************************************************************/ package org.simantics.g3d.vtk.handlers; -import java.util.HashMap; -import java.util.Map; - import javax.vecmath.Vector3d; import org.eclipse.core.commands.AbstractHandler; @@ -22,15 +19,17 @@ import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.handlers.HandlerUtil; +import org.simantics.g3d.math.MathTools; import org.simantics.g3d.vtk.common.VtkView; import org.simantics.utils.threads.AWTThread; import org.simantics.utils.threads.ThreadUtils; +import vtk.vtkCamera; +import vtk.vtkRenderer; + public class ParallelPerspectiveHandler extends AbstractHandler { - private Map cameraPos = new HashMap(); - @Override public Object execute(ExecutionEvent event) throws ExecutionException { Command command = event.getCommand(); @@ -44,30 +43,41 @@ public class ParallelPerspectiveHandler extends AbstractHandler { @Override public void run() { + vtkRenderer ren = panel.getRenderer(); + vtkCamera cam = ren.GetActiveCamera(); if (activate){ + Vector3d focal = new Vector3d(panel.getRenderer().GetActiveCamera().GetFocalPoint()); Vector3d pos = new Vector3d(panel.getRenderer().GetActiveCamera().GetPosition()); - cameraPos.put(panel, pos); + double dist = MathTools.distance(pos, focal); + cam.SetParallelScale(dist/4.0); + // camera must be moved backwards, or graphics get clipped when parallel view is zoomed out + // TODO : is there a better way to do this? Vector3d dir = new Vector3d(pos); dir.sub(focal); dir.normalize(); dir.scale(100); dir.add(focal); - panel.getRenderer().GetActiveCamera().SetPosition(dir.x, dir.y, dir.z); - + cam.SetPosition(dir.x, dir.y, dir.z); - panel.getRenderer().GetActiveCamera().SetParallelProjection(1); - panel.getRenderer().ResetCameraClippingRange(); + cam.SetParallelProjection(1); + ren.ResetCameraClippingRange(); } else { - panel.getRenderer().GetActiveCamera().SetParallelProjection(0); - Vector3d pos = cameraPos.get(panel); - if (pos != null) { - panel.getRenderer().GetActiveCamera().SetPosition(pos.x, pos.y, pos.z); - } - panel.getRenderer().ResetCameraClippingRange(); + + double scale = cam.GetParallelScale(); + cam.SetParallelProjection(0); + + Vector3d focal = new Vector3d(panel.getRenderer().GetActiveCamera().GetFocalPoint()); + Vector3d pos = new Vector3d(panel.getRenderer().GetActiveCamera().GetPosition()); + Vector3d dir = new Vector3d(pos); + dir.sub(focal); + dir.normalize(); + dir.scale(scale*4.0); + dir.add(focal); + cam.SetPosition(dir.x, dir.y, dir.z); + ren.ResetCameraClippingRange(); } - // panel.UpdateLight(); panel.refresh(); } 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 7eb4cfc9..9c444b4f 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 @@ -168,6 +168,7 @@ public class vtkCameraAndSelectorAction extends vtkSwtAction implements ISelecti zoomFactor = Math.pow(1.02, (y - lastY)); if (cam.GetParallelProjection() == 1) { cam.SetParallelScale(cam.GetParallelScale() / zoomFactor); + resetCameraClippingRange(); } else { cam.Dolly(zoomFactor); resetCameraClippingRange();