Thread: [Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/tool CameraTool.java,NONE,1.1 AbstractTool.
Status: Pre-Alpha
Brought to you by:
henryml
|
From: rimestad <rim...@us...> - 2005-12-01 10:10:20
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3390/src/net/sourceforge/bprocessor/gl/tool Modified Files: AbstractTool.java PencilTool.java ToolFactory.java Added Files: CameraTool.java Removed Files: RotationTool.java CameraZoomTimer.java CameraMoveTimer.java Log Message: removed the two timers from the system and added a renamed rotationtool to cameratool. Changed camera rotation so that it uses the geometry class from the model package. It is now relatively good rotation and drag in the right directions. The are one question ralated to horizontal rotation either we shall rotate about the z-axis or the up vector, as it is now I use the up vector but that makes rotation a bit wird in some situations. If we choose to use the z-axis we cant rotate if we look from above. --- CameraMoveTimer.java DELETED --- --- NEW FILE: CameraTool.java --- //--------------------------------------------------------------------------------- // $Id: CameraTool.java,v 1.1 2005/12/01 10:10:02 rimestad Exp $ // // Copyright (c) 2005 The BProcessor Team (http://bprocessor.sourceforge.net) // Released under the Lesser GNU Public License v2.1 //--------------------------------------------------------------------------------- package net.sourceforge.bprocessor.gl.tool; import net.sourceforge.bprocessor.gl.GLView; import net.sourceforge.bprocessor.gl.view.View; import net.sourceforge.bprocessor.gl.view.View3D; import net.sourceforge.bprocessor.model.Geometry; import net.sourceforge.bprocessor.model.Plane; import net.sourceforge.bprocessor.model.Vertex; //import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.InputEvent; import java.awt.Cursor; import javax.swing.Timer; import org.apache.log4j.Logger; /** * The rotationtool */ public class CameraTool extends AbstractTool { /** Rotation mode */ public static final int ROTATION = 0; /** Roll mode */ public static final int ROLL = 1; /** The logger */ private static Logger log = Logger.getLogger(CameraTool.class); /** The carmera move timer */ private static Timer timer; /** The mouse position last time the mouse was pressed initializes to (0,0) */ private static int[] pressPos = new int[2]; /** The current rotation mode */ protected int mode = ROTATION; /** The cursor for rotation */ private Cursor rotationCursor; /** The cursor for drag */ private Cursor dragCursor; /** * KeyListener for the GL Canvas * @param glv The 3D canvas * @param cursor1 The Mouse cursor for rotation * @param cursor2 The Mouse cursor for drag */ public CameraTool(GLView glv, Cursor cursor1, Cursor cursor2) { super(glv, cursor1); rotationCursor = cursor1; dragCursor = cursor2; } /** * Invoked when the mouse cursor has been moved * @param e The MouseEvent object */ protected void moved(MouseEvent e) { if ((e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { mode = ROLL; } else { mode = ROTATION; } } /** * Invoked when the mouse is held pressed and moved * @param e The MouseEvent object */ protected void dragged(MouseEvent e) { View view = glv.getView(); if ((e.getModifiersEx() & MouseEvent.BUTTON2_DOWN_MASK) == MouseEvent.BUTTON2_DOWN_MASK || e.getButton() == MouseEvent.BUTTON2) { glv.setCursor(dragCursor); double[] center = ((View3D)view).getCenter(); double[] camera = ((View3D)view).getCamera(); Vertex first = view.toPlaneCoords(new double[] {previousPos[0], previousPos[1]}, new Plane((camera[0] - center[0]), (camera[1] - center[1]), (camera[2] - center[2]), 0)); Vertex second = view.toPlaneCoords(new double[] {e.getX(), e.getY()}, new Plane((camera[0] - center[0]), (camera[1] - center[1]), (camera[2] - center[2]), 0)); view.translate(new double[] {first.getX() - second.getX(), first.getY() - second.getY(), first.getZ() - second.getZ()}); } else if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == MouseEvent.BUTTON1_DOWN_MASK || e.getButton() == MouseEvent.BUTTON1) { View3D view2 = (View3D) view; double[] pivot = super.selectionCenter(); double[] camera = view2.getCamera(); double[] center = view2.getCenter(); double[] roll = view2.getRoll(); double[] zero = new double[]{0, 0, 0}; Vertex up = new Vertex("", roll[0], roll[1], roll[2]); up.scale(1 / up.length()); double x = center[0] - camera[0]; double y = center[1] - camera[1]; double z = center[2] - camera[2]; Vertex forward = new Vertex("", x, y, z); forward.scale(1 / forward.length()); Vertex sidewards = up.cross(forward); sidewards.scale(1 / sidewards.length()); log.info("forward: " + forward.getX() + ", " + forward.getY() + ", " + forward.getZ()); log.info("sideward: " + sidewards.getX() + ", " + sidewards.getY() + ", " + sidewards.getZ()); log.info("upwrad: " + up.getX() + ", " + up.getY() + ", " + up.getZ()); double angleX = ((double)(e.getX() - previousPos[0]) / 360) * Math.PI; double angleY = ((double)(e.getY() - previousPos[1]) / 360) * Math.PI; if (e.isShiftDown()) { // roll camera Geometry.rotate(angleY, forward.getX(), forward.getY(), forward.getZ(), roll, zero); } else if (e.isAltDown()) { // rotate camera about itself double turn = 1; if (roll[2] < 0) { turn = -1; } Geometry.rotate(angleX, up.getX(), up.getY(), up.getZ(), center, camera); Geometry.rotate(-angleY, sidewards.getX(), sidewards.getY(), sidewards.getZ(), center, camera); Geometry.rotate(angleX, 0, 0, turn, roll, new double[]{0, 0, 0}); Geometry.rotate(angleY, sidewards.getX(), sidewards.getY(), sidewards.getZ(), roll, zero); } else { // rotate camera about point of view (or selection if any) Geometry.rotate(-angleX, up.getX(), up.getY(), up.getZ(), camera, pivot); Geometry.rotate(-angleX, up.getX(), up.getY(), up.getZ(), center, pivot); //Geometry.rotate(-angleX, 0, 0, 1, roll, new double[]{0, 0, 0}); Geometry.rotate(angleY, sidewards.getX(), sidewards.getY(), sidewards.getZ(), camera, pivot); Geometry.rotate(angleY, sidewards.getX(), sidewards.getY(), sidewards.getZ(), center, pivot); Geometry.rotate(angleY, sidewards.getX(), sidewards.getY(), sidewards.getZ(), roll, zero); } glv.repaint(); } } /** * Invoked when a mouse button has been pressed on a component. * @param e The MouseEvent object */ protected void pressed(MouseEvent e) { glv.setCursor(rotationCursor); if (e.getButton() == MouseEvent.BUTTON1) { if ((e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { mode = ROLL; } else { mode = ROTATION; } } } /** * Invoked when a mouse button has been released on a component. * @param e The MouseEvent */ protected void released(MouseEvent e) { } } Index: ToolFactory.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/ToolFactory.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** ToolFactory.java 29 Nov 2005 19:00:39 -0000 1.16 --- ToolFactory.java 1 Dec 2005 10:10:02 -0000 1.17 *************** *** 50,54 **** /** rotation tool */ ! private RotationTool rotation; /** Tape measure tool */ --- 50,54 ---- /** rotation tool */ ! private CameraTool rotation; /** Tape measure tool */ *************** *** 103,110 **** extrusion = new ExtrusionTool(glv, pencilcursor); clipplane = new ClipplaneTool(glv, pencilcursor); ! rotation = new RotationTool(glv, rotationCursor, dragCursor); tapeMeasure = new TapeMeasureTool(glv, pencilcursor); - Notifier.getInstance().addListener(select); } --- 103,109 ---- extrusion = new ExtrusionTool(glv, pencilcursor); clipplane = new ClipplaneTool(glv, pencilcursor); ! rotation = new CameraTool(glv, rotationCursor, dragCursor); tapeMeasure = new TapeMeasureTool(glv, pencilcursor); Notifier.getInstance().addListener(select); } --- CameraZoomTimer.java DELETED --- Index: PencilTool.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/PencilTool.java,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** PencilTool.java 30 Nov 2005 23:04:54 -0000 1.40 --- PencilTool.java 1 Dec 2005 10:10:02 -0000 1.41 *************** *** 18,22 **** import net.sourceforge.bprocessor.gl.view.Transformation; import net.sourceforge.bprocessor.gl.view.View; - import net.sourceforge.bprocessor.gl.view.View3D; import net.sourceforge.bprocessor.model.CoordinateSystem; import net.sourceforge.bprocessor.model.Edge; --- 18,21 ---- *************** *** 641,708 **** } changed = true; - } else if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT) { - View3D view = (View3D) glv.getView(); - double[] pivot = AbstractTool.selectionCenter(); - double[] camera = view.getCamera(); - double[] center = view.getCenter(); - double[] roll = view.getRoll(); - - double angle; - if (e.getKeyCode() == KeyEvent.VK_LEFT) { - angle = Math.PI / 18; - } else { - angle = -Math.PI / 18; - } - if (e.isShiftDown()) { - Geometry.rotate(angle, 0, 0, 1, camera, center); - } else if (e.isAltDown()) { - Geometry.rotate(angle, roll[0], roll[1], roll[2], center, camera); - } else { - Geometry.rotate(angle, 0, 0, 1, camera, pivot); - Geometry.rotate(angle, 0, 0, 1, center, pivot); - Geometry.rotate(angle, 0, 0, 1, roll, new double[]{0, 0, 0}); - } - glv.repaint(); - } else if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) { - View3D view = (View3D) glv.getView(); - double[] pivot = AbstractTool.selectionCenter(); - double[] camera = view.getCamera(); - double[] center = view.getCenter(); - double[] roll = view.getRoll(); - - double[] zero = new double[]{0, 0, 0}; - double x; - double y; - double z; - - Vertex up = new Vertex("", roll[0], roll[1], roll[2]); - x = center[0] - camera[0]; - y = center[1] - camera[1]; - z = center[2] - camera[2]; - Vertex forward = new Vertex("", x, y, z); - - Vertex sidewards = up.cross(forward); - sidewards.scale(1 / sidewards.length()); - x = sidewards.getX(); - y = sidewards.getY(); - z = sidewards.getZ(); - - double angle; - if (e.getKeyCode() == KeyEvent.VK_UP) { - angle = Math.PI / 18; - } else { - angle = -Math.PI / 18; - } - if (e.isShiftDown()) { - Geometry.rotate(angle, x, y, z, camera, center); - } else if (e.isAltDown()) { - Geometry.rotate(angle, x, y, z, center, camera); - } else { - Geometry.rotate(angle, x, y, z, camera, pivot); - Geometry.rotate(angle, x, y, z, center, pivot); - Geometry.rotate(angle, x, y, z, roll, zero); - } - - glv.repaint(); } else { super.keyPressed(e); --- 640,643 ---- Index: AbstractTool.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/AbstractTool.java,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** AbstractTool.java 30 Nov 2005 23:04:54 -0000 1.32 --- AbstractTool.java 1 Dec 2005 10:10:02 -0000 1.33 *************** *** 12,15 **** --- 12,16 ---- import net.sourceforge.bprocessor.model.Vertex; import net.sourceforge.bprocessor.gl.view.View; + import net.sourceforge.bprocessor.gl.view.View3D; import net.sourceforge.bprocessor.gl.GLView; *************** *** 100,106 **** View v = glv.getView(); if (rotation > 0) { ! v.zoom(1.1); } else { ! v.zoom(0.9); } glv.repaint(false); --- 101,107 ---- View v = glv.getView(); if (rotation > 0) { ! v.zoomout(); } else { ! v.zoomin(); } glv.repaint(false); *************** *** 112,117 **** * @return The center of the selection */ ! public static double[] selectionCenter() { ! double[] center = new double[] {0, 0, 0}; Iterator it = selection.iterator(); if (it.hasNext()) { --- 113,118 ---- * @return The center of the selection */ ! public double[] selectionCenter() { ! double[] center = ((View3D)glv.getView()).getCenter(); Iterator it = selection.iterator(); if (it.hasNext()) { *************** *** 137,151 **** View v = glv.getView(); if (e.getKeyCode() == KeyEvent.VK_UP) { ! v.translateCenter(new double[] {0.0, -1.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { ! v.translateCenter(new double[] {0.0, 1.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { ! v.translateCenter(new double[] {-1.0, 0.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { ! v.translateCenter(new double[] {1.0, 0.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_Z) { ! v.zoom(1.1); } else if (e.getKeyCode() == KeyEvent.VK_X) { ! v.zoom(0.9); } else if (e.getKeyCode() == KeyEvent.VK_Q) { glv.changeTool(Tool.SELECT_TOOL); --- 138,152 ---- View v = glv.getView(); if (e.getKeyCode() == KeyEvent.VK_UP) { ! v.translate(new double[] {0.0, -1.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { ! v.translate(new double[] {0.0, 1.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { ! v.translate(new double[] {-1.0, 0.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { ! v.translate(new double[] {1.0, 0.0, 0.0}); } else if (e.getKeyCode() == KeyEvent.VK_Z) { ! v.zoomout(); } else if (e.getKeyCode() == KeyEvent.VK_X) { ! v.zoomin(); } else if (e.getKeyCode() == KeyEvent.VK_Q) { glv.changeTool(Tool.SELECT_TOOL); --- RotationTool.java DELETED --- |