Avatar billede fredand Forsker
15. oktober 2003 - 08:56 Der er 8 kommentarer og
1 løsning

Rotate a object at a certain cordinate with Java3D

Hello!

I have build a small app in Java3D. I try to develop my own navigation, (I dont want to use the KeyNavigation). So I start to develop a class that implements the KeyListener interface. This class shall in the end stear the camera view. It works when I move it in  forward/backwards  and to left/right.

I also want to be able to rotate the camera view about the Y-axis. To simplify and illustrate this question I rotate a Cube instead. But it do not work as I want.

If you try the code below you will see a big cube, start to back away from the cube by pressing the VK_DOWN-key. Back pretty far. Now push the VK_SPACE and the cube suddenly jumps to the 0,0,0 cordinate and push space even more and you will see that it rotate.

I want the cube to say at its orgin cordinate and to rotate at that point, not jump away.

So if any one could tell me to get the cube not to jump away, please let me know.

Best Regards
Fredrik

You will only need the classes below for this!


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 TransformGroupTesterApplet extends Applet
{
    BranchGroup branchGroup;
    public void init()
    {
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(config);
        add("Center", canvas3D);
        SimpleUniverse simpleUniverse = new SimpleUniverse(canvas3D);

        branchGroup = new BranchGroup();

        //Start point for the camera
        Transform3D transform3D = new Transform3D();
        transform3D.set(new Vector3f(0.0f, 2.0f, 0.0f));
        TransformGroup transformGroup = simpleUniverse.getViewingPlatform().getViewPlatformTransform();
        transformGroup.setTransform(transform3D);

        //The cube
        TransformGroup cube = new TransformGroup();
        Transform3D cubetransform3D = new Transform3D();
        cubetransform3D.set(new Vector3f(0.0f, 2.0f, -2.0f));
        cube.setTransform(cubetransform3D);
        cube.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        branchGroup.addChild(cube);
        cube.addChild(new ColorCube(0.4));

        canvas3D.addKeyListener( new KeyListener3D(transformGroup, cube) );

        simpleUniverse.addBranchGraph(branchGroup);
    }

    public static void main(String[] args)
    {
        Frame frame = new MainFrame(new TransformGroupTesterApplet(), 600, 400);
    }
}


//The KeyListener



import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class KeyListener3D implements KeyListener
{
    TransformGroup transformGroup;
    TransformGroup transformGroup2;
    float x = 0.0f;
    float y = 2.0f;
    float z = 0.0f;
    private float angle = 0.0f;

    public KeyListener3D(TransformGroup tfg, TransformGroup tfg2)
    {
        transformGroup = tfg;
        transformGroup2 = tfg2;
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            Transform3D transform3D = new Transform3D();
            z = z - 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            Transform3D transform3D = new Transform3D();
            z = z + 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            Transform3D transform3D = new Transform3D();
            x = x - 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            Transform3D transform3D = new Transform3D();
            x = x + 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_SPACE )
        {
            //THE CUBE ROTATION THAT DO NOT WORK
            Transform3D transform3D = new Transform3D();
            transform3D.set(new Vector3f(0.0f, 4.0f, -2.0f));
            angle += 0.1f;
            transform3D.rotY(angle);
            transformGroup2.setTransform(transform3D);

        }
    }

    public void keyReleased(KeyEvent e)
    {
    }
}
Avatar billede soreno Praktikant
15. oktober 2003 - 09:07 #1
Why do you specify these cordinates:
transform3D.set(new Vector3f(0.0f, 4.0f, -2.0f));

?

Why not:
transform3D.set(new Vector3f(x, y, z));
Avatar billede soreno Praktikant
15. oktober 2003 - 09:10 #2
Is it really needed.

The position of the cube is static ?

Then this would probably be just as good:
        else if( e.getKeyCode() == KeyEvent.VK_SPACE )
        {
            //THE CUBE ROTATION THAT DO NOT WORK
            Transform3D transform3D = new Transform3D();
            angle += 0.1f;
            transform3D.rotY(angle);
            transformGroup2.setTransform(transform3D);
        }

(I have not downloaded Java3D - no test has been carried out..)
Avatar billede fredand Forsker
15. oktober 2003 - 10:27 #3
Hello Soreno!

I tried that too, as you said the transform3D.set(new Vector3f(0.0f, 4.0f, -2.0f)); actually has no effect here.

When the rotY-method is called the cube jumps to the 0,0,0 cordinate.

I want it to stay at the cordinate it is at now.

Fredrik
Avatar billede soreno Praktikant
15. oktober 2003 - 10:33 #4
I *think* that's because you initialize transform3D every time you handle the event. The transformation of the object is probably initialized to (0, 0, 0).

Perhaps you should try something like this:
public class KeyListener3D implements KeyListener
{
    TransformGroup transformGroup;
    TransformGroup transformGroup2;
    float x = 0.0f;
    float y = 2.0f;
    float z = 0.0f;
    private float angle = 0.0f;
    private Transform3D cubeTransform;

    public KeyListener3D(TransformGroup tfg, TransformGroup tfg2)
    {
        transformGroup = tfg;
        transformGroup2 = tfg2;
        cubeTransform = new Transform3D();
        cubeTransform .set(new Vector3f(0.0f, 0.0f, 0.0f));
    }

    [...]

        else if( e.getKeyCode() == KeyEvent.VK_SPACE )
        {
            angle += 0.1f;
            transform3D.rotY(angle);
            transformGroup2.setTransform(transform3D);
        }


I really think this works !

:-)
Avatar billede fredand Forsker
15. oktober 2003 - 11:16 #5
Hello!

Sorry to say but if I got you right you mean like this (below) and it did not work. The cube jumps away to 0,0,0.

I guess that it is the rotY method that moves it to that cordinate.

Fredrik

import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class KeyListener3D implements KeyListener
{
    TransformGroup transformGroup;
    TransformGroup transformGroup2;
    float x = 0.0f;
    float y = 2.0f;
    float z = 0.0f;
    private float angle = 0.0f;
    private Transform3D cubeTransform;


    public KeyListener3D(TransformGroup tfg, TransformGroup tfg2)
    {
        transformGroup = tfg;
        transformGroup2 = tfg2;
        cubeTransform = new Transform3D();
        cubeTransform.set(new Vector3f(0.0f, 0.0f, 0.0f));
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            Transform3D transform3D = new Transform3D();
            z = z - 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            Transform3D transform3D = new Transform3D();
            z = z + 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            Transform3D transform3D = new Transform3D();
            x = x - 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            Transform3D transform3D = new Transform3D();
            x = x + 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_SPACE )
        {
            //THE CUBE ROTATION THAT DO NOT WORK
            //Transform3D transform3D = new Transform3D();
            //transform3D.set(new Vector3f(0.0f, 4.0f, -2.0f));
            angle += 0.1f;
            cubeTransform .rotY(angle);
            transformGroup2.setTransform(cubeTransform );

        }
    }

    public void keyReleased(KeyEvent e)
    {
    }
}
Avatar billede soreno Praktikant
15. oktober 2003 - 11:26 #6
Probably because the constructor does this:
cubeTransform.set(new Vector3f(0.0f, 0.0f, 0.0f));

It should be:
cubeTransform.set(new Vector3f(0.0f, 4.0f, -2.0f));


I have downloadet the API but I don't know how to test (I have absolutly no experience with applets).

What should the .html file contain ?

I tried this:
    <applet align=middle code="TransformGroupTesterApplet.class" width=600 height=480>

But I doesn't work.
Avatar billede fredand Forsker
15. oktober 2003 - 11:31 #7
Hello!

You do not need a HTML-file.

Just run it like a app since we got the main like this:
    public static void main(String[] args)
    {
        Frame frame = new MainFrame(new TransformGroupTesterApplet(), 600, 400);
    }
Avatar billede fredand Forsker
15. oktober 2003 - 16:57 #8
Hello!
Solved like this
package java3d;

import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class KeyListener3D implements KeyListener
{
    TransformGroup transformGroup;
    TransformGroup transformGroup2;
    float x = 0.0f;
    float y = 2.0f;
    float z = 20.0f;
    private float angle = 0.0f;


    public KeyListener3D(TransformGroup tfg, TransformGroup tfg2)
    {
        transformGroup = tfg;
        transformGroup2 = tfg2;
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            Transform3D transform3D = new Transform3D();
            z = z - 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            Transform3D transform3D = new Transform3D();
            z = z + 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            Transform3D transform3D = new Transform3D();
            x = x - 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            Transform3D transform3D = new Transform3D();
            x = x + 0.1f;
            transform3D.set(new Vector3f(x, y, z));
            transformGroup.setTransform(transform3D);
        }
        else if( e.getKeyCode() == KeyEvent.VK_SPACE )
        {
            Transform3D transform3D1 = new Transform3D();
            transform3D1.set(new Vector3f(0.0f, 2.0f, 20.0f));
            Transform3D transform3D2 = new Transform3D();
            angle += 0.1f;
            transform3D2.rotY(angle);
            transform3D1.mul(transform3D2);
            transformGroup.setTransform(transform3D1 );
        }
    }

    public void keyReleased(KeyEvent e)
    {
    }
}
Avatar billede fredand Forsker
15. oktober 2003 - 16:58 #9
Thanks for every bodys time!

Fredrik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester