Hello! I try to develop a class for mouse navigation. At the end this will be applied to the camera, during development I use a cone-object to navigate from above, so it should be easy to see what happens.
The function is: Arrow_UP move forward Arrow_DOWN move backwards Arrow_LEFT move left Arrow_right move right Mouse_on_left_side_of_screen rotate left Mouse_on_right_side_of_screen rotate right This works pretty fine, but when the user has moved the cone forward for eg. the rotation should be set or multiplied to that new position. Now it works like this: User rotate the cone to angle X form startingpoint ZERO. User moves the cone forward along the angle X. User rotate the cone to a new angle X form startingpoint ZERO, BUT NOW SHOULD THE OLD ANGLE X BE THE STARTINGPOINT FOR THE ROTATION. So what I want is something like this: User rotate the cone to angle X form startingpoint ZERO. User moves the cone forward along the angle X. The startingpoint is set to angle X. User rotate the cone to a new angle X form the new startingpoint. I have struggle with this for days now and can't figure out how to solve it. Hope you understand my problem and get eager to help :-) Best regards Fredrik Andersson Below is the full code to test this (it include 2 classes): import java.applet.*; import java.awt.*; import java.awt.Frame; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.behaviors.keyboard.*; import javax.media.j3d.*; import javax.vecmath.*; import javax.swing.*; import java.util.*; public class TestMouseInteractor extends Applet { BranchGroup branchGroup; TransformGroup transformGroup1; Canvas3D canvas3D; Cone cone; public void init() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas3D = new Canvas3D(config); add("Center", canvas3D); SimpleUniverse simpleUniverse = new SimpleUniverse(canvas3D); branchGroup = new BranchGroup(); simpleUniverse.addBranchGraph( addLight() ); //Cone cone = new Cone(0.4f, 0.8f); transformGroup1 = new TransformGroup(); Transform3D transform3D1 = new Transform3D(); transform3D1.set(new Vector3f(0.0f, 0.0f, -20.0f)); transformGroup1.setTransform(transform3D1); transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformGroup1.addChild(cone); branchGroup.addChild(transformGroup1); branchGroup.compile(); simpleUniverse.addBranchGraph(branchGroup); createMouseInteractor(); } public void createMouseInteractor() { MouseInteractor mouseInteractor = new MouseInteractor(transformGroup1, 700, 300, new Vector3f(0.0f, 0.0f, -20.0f)); canvas3D.addKeyListener(mouseInteractor); canvas3D.addMouseListener(mouseInteractor); canvas3D.addMouseMotionListener(mouseInteractor); } private BranchGroup addLight() { BranchGroup branchGroup = new BranchGroup(); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); bounds.setRadius(1000d); Color3f color = new Color3f(0.7f, 0.7f, 0.7f); DirectionalLight lightD = new DirectionalLight(color, new Vector3f( -1.0f, 0.0f, -8.0f )); lightD.setInfluencingBounds(bounds); branchGroup.addChild(lightD); AmbientLight ambientLightNode = new AmbientLight(color); ambientLightNode.setInfluencingBounds(bounds); branchGroup.addChild(ambientLightNode); branchGroup.compile(); return branchGroup; } public static void main(String[] args) { Frame frame = new MainFrame(new TestMouseInteractor(), 700, 300); } } //--------------------------------------------------------- import java.applet.*; import java.awt.*; import java.awt.Frame; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.behaviors.keyboard.*; import javax.media.j3d.*; import javax.vecmath.*; import javax.swing.*; import com.sun.j3d.loaders.*; import java.io.*; import java.util.*; import com.sun.j3d.utils.behaviors.mouse.*; public class MouseInteractor implements MouseListener, MouseMotionListener, KeyListener { TransformGroup camera; int height = 300; int width = 700; double[] rotationAnglesAroundY; double rotationStepAroundY = (Math.PI/2) / (width/2); int indexAroundY; double rotationAroundY; boolean notFirstTimeOnX; boolean notFirstTimeOnY; Transform3D positionTransform3D = new Transform3D(); Transform3D angleTransform3D = new Transform3D(); final static float DISTANCE = 1.0f; private boolean isMovePossible = true; private boolean isLeftMovePossible = true; private boolean isRightMovePossible = true; private double angle = 0.0; public MouseInteractor(TransformGroup c, int w, int h, Vector3f pos) { width = w; height = h; camera = c; positionTransform3D.set(pos); initiateRotationAngles(); } public void initiateRotationAngles() { rotationAnglesAroundY = new double[width]; for(int i = (width/2)-1; i > -1; i--) { if(i == (width/2)-1) { rotationAnglesAroundY[i] = 0; } else { rotationAnglesAroundY[i] = rotationAnglesAroundY[i+1] + rotationStepAroundY; } } for(int i = (width/2); i < width; i++) { if(i == (width/2)) { rotationAnglesAroundY[i] = 0; } else { rotationAnglesAroundY[i] = rotationAnglesAroundY[i-1] + rotationStepAroundY; } } /* int index = width/2; for(int i = (width/2)-1; i > -1; i--) { System.out.println(i + ": " + rotationAnglesAroundY[i] + "\t\t" + index + ": "+ rotationAnglesAroundY[index++]); } */ } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { double diffY = 0; double diffX = 0; //Look left if( e.getX() <= (width/2)-1) { //Passing from right to left if(indexAroundY >= (width/2)) { angleTransform3D.rotZ(rotationAnglesAroundY[indexAroundY]); positionTransform3D.mul(angleTransform3D); camera.setTransform( positionTransform3D ); rotationAroundY = 0; indexAroundY = e.getX(); } //Rot left diffX = rotationAnglesAroundY[e.getX()] - rotationAroundY; rotationAroundY = rotationAnglesAroundY[e.getX()]; indexAroundY = e.getX(); angleTransform3D.rotZ( diffX ); positionTransform3D.mul(angleTransform3D); camera.setTransform( positionTransform3D ); } //Look right else if( e.getX() >= (width/2)) { //Passing from left to right if(indexAroundY <= (width/2)-1 && notFirstTimeOnY) { angleTransform3D.rotZ(-rotationAnglesAroundY[indexAroundY]); positionTransform3D.mul(angleTransform3D); camera.setTransform( positionTransform3D ); rotationAroundY = 0; indexAroundY = e.getX(); } //Rot right diffX = rotationAnglesAroundY[e.getX()] - rotationAroundY; rotationAroundY = rotationAnglesAroundY[e.getX()]; indexAroundY = e.getX(); angleTransform3D.rotZ( -diffX ); positionTransform3D.mul(angleTransform3D); camera.setTransform( positionTransform3D ); notFirstTimeOnY = true; } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if( e.getKeyCode() == KeyEvent.VK_UP ) { if(isMovePossible) { Transform3D temp = new Transform3D(); temp.set(new Vector3f(0, DISTANCE, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); } else { Transform3D temp = new Transform3D(); temp.set(new Vector3f(0, -DISTANCE/2, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); setIsMovePossible(true); } } else if( e.getKeyCode() == KeyEvent.VK_DOWN ) { if(isMovePossible) { Transform3D temp = new Transform3D(); temp.set(new Vector3f(0, -DISTANCE, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); } else { Transform3D temp = new Transform3D(); temp.set(new Vector3f(0, DISTANCE/2, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); setIsMovePossible(true); } } else if( e.getKeyCode() == KeyEvent.VK_LEFT ) { if(isLeftMovePossible) { Transform3D temp = new Transform3D(); temp.set(new Vector3f(-DISTANCE, 0, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); } else { Transform3D temp = new Transform3D(); temp.set(new Vector3f(DISTANCE/2, 0, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); setIsMovePossible(true); } } else if( e.getKeyCode() == KeyEvent.VK_RIGHT ) { if(isRightMovePossible) { Transform3D temp = new Transform3D(); temp.set(new Vector3f(DISTANCE, 0, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); } else { Transform3D temp = new Transform3D(); temp.set(new Vector3f(-DISTANCE/2, 0, 0)); positionTransform3D.mul(temp); camera.setTransform( positionTransform3D ); setIsMovePossible(true); } } } public void keyReleased(KeyEvent e) { } public synchronized void setIsMovePossible(boolean b) { isMovePossible = b; } public synchronized void setIsLeftMovePossible(boolean b) { isLeftMovePossible = b; } public synchronized void setIsRightMovePossible(boolean b) { isRightMovePossible = b; } } =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA3D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".