Thread: [Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/tool AbstractTool.java,1.30,1.31 PencilTool
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2005-11-24 10:31:30
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17584/src/net/sourceforge/bprocessor/gl/tool Modified Files: AbstractTool.java PencilTool.java Log Message: Test of rotation using arrow keys in the pencil tool Index: PencilTool.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/PencilTool.java,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** PencilTool.java 20 Nov 2005 19:33:52 -0000 1.36 --- PencilTool.java 24 Nov 2005 10:31:22 -0000 1.37 *************** *** 18,21 **** --- 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; *************** *** 26,29 **** --- 27,31 ---- import net.sourceforge.bprocessor.model.Space; import net.sourceforge.bprocessor.model.Geometry; + import net.sourceforge.bprocessor.model.Matrix; import java.util.Iterator; *************** *** 489,492 **** --- 491,527 ---- /** + * output values + * @param v The values + */ + private static void output(double[] v) { + System.out.println("(" + v[0] + ", " + v[1] + ", " + v[2] + ")"); + } + + /** + * Rotate + * @param angle The angle + * @param x The x + * @param y The y + * @param z The z + * @param vector The vector to rotate + * @param center The center of rotation + */ + private void rotate(double angle, double x, double y, double z, + double[] vector, double[] center) { + + double[] v = new double[4]; + + v[0] = vector[0] - center[0]; + v[1] = vector[1] - center[1]; + v[2] = vector[2] - center[2]; + v[3] = 1; + Matrix rotation = Matrix.rotation(angle, x, y, z); + v = rotation.multiply(v); + vector[0] = v[0] + center[0]; + vector[1] = v[1] + center[1]; + vector[2] = v[2] + center[2]; + } + + /** * Invoked when a key has been pressed. Lets user delete what is selected. * @param e The KeyEvent *************** *** 494,497 **** --- 529,533 ---- public void keyPressed(KeyEvent e) { boolean changed = false; + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { if (active != null) { *************** *** 583,586 **** --- 619,690 ---- } 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(); + + roll[0] = 0; + roll[1] = 0; + roll[2] = 1; + + double angle; + if (e.getKeyCode() == KeyEvent.VK_LEFT) { + angle = Math.PI / 6; + } else { + angle = -Math.PI / 6; + } + if (e.isShiftDown()) { + rotate(angle, 0, 0, 1, camera, center); + } else if (e.isAltDown()) { + rotate(angle, 0, 0, 1, center, camera); + } else { + rotate(angle, 0, 0, 1, camera, pivot); + rotate(angle, 0, 0, 1, center, pivot); + } + 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(); + + roll[0] = 0; + roll[1] = 0; + roll[2] = 1; + + double x; + double y; + double z; + + Vertex up = new Vertex("", 0, 0, 1); + 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 / 6; + } else { + angle = -Math.PI / 6; + } + if (e.isShiftDown()) { + rotate(angle, x, y, z, camera, center); + } else if (e.isAltDown()) { + rotate(angle, x, y, z, center, camera); + } else { + rotate(angle, x, y, z, camera, pivot); + rotate(angle, x, y, z, center, pivot); + } + glv.repaint(); } else { super.keyPressed(e); Index: AbstractTool.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/AbstractTool.java,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** AbstractTool.java 22 Nov 2005 13:40:22 -0000 1.30 --- AbstractTool.java 24 Nov 2005 10:31:22 -0000 1.31 *************** *** 106,109 **** --- 106,132 ---- glv.repaint(false); } + + /** + * Calculate the center of the selection + * TODO calculate the average.. + * @return The center of the selection + */ + public static double[] selectionCenter() { + double[] center = new double[] {0, 0, 0}; + Iterator it = selection.iterator(); + if (it.hasNext()) { + Object o = it.next(); + if (o instanceof Surface) { + Vertex v = ((Surface)o).center(); + center = new double[] {v.getX(), v.getY(), v.getZ()}; + } else if (o instanceof Edge) { + center = ((Edge)o).center(); + } else if (o instanceof Vertex) { + Vertex v = (Vertex)o; + center = new double[] {v.getX(), v.getY(), v.getZ()}; + } + } + return center; + } /** |