*******************************************************************************/
package org.simantics.g3d.vtk.handlers;
-import javax.vecmath.Vector3d;
-
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.Command;
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;
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());
- 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);
- cam.SetPosition(dir.x, dir.y, dir.z);
-
+ double distance = cam.GetDistance();
+ double angle = cam.GetViewAngle();
+ double scale = Math.tan(Math.toRadians(angle / 2)) * distance;
+ cam.SetParallelScale(scale);
cam.SetParallelProjection(1);
ren.ResetCameraClippingRange();
} else {
-
- 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.refresh();