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".

Reply via email to