Avatar billede fredand Forsker
16. oktober 2003 - 16:36 Der er 2 kommentarer og
1 løsning

Java3d - problems moving a cube

Hello!

I need to move a object in Java3D

VK_LEFT rotates the object to the left.
VK_RIGHT rotates the object to the left.
That works fine.

VK_UP should move the object along Y-axis up. If the object is rotated before this key stroke the rotation should remain when the object moves along the Y-axis. This do not work for me.

VK_UP should move the object along Y-axis down. If the object is rotated before this key stroke the rotation should remain when the object moves along the Y-axis. This do not work for me.

So if any one know how to do this please let me know.

Best regards
Fredrik

My code 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 Test 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();

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


        canvas3D.addKeyListener( new TestListener(cube) );

        simpleUniverse.addBranchGraph(branchGroup);
    }

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

package java3d;

import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;

public class TestListener implements KeyListener
{
    final static float DISTANCE     = 0.1f;
    final static double TURNANGLE     = 0.1;
    float x = 0.0f;
    float y = 2.0f;
    float z = -20.0f;
    private double angle = 0.0;

    TransformGroup transformGroup;
    Transform3D positionTransform3D = new Transform3D();
    Transform3D angleTransform3D = new Transform3D();

    public TestListener(TransformGroup tfg)
    {
        transformGroup = tfg;
        positionTransform3D.set(new Vector3f(x, y, z));
        //positionTransform3D.mul(angleTransform3D);
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            /*
                //This just moves the cube but the twisting is not added
                y = y + DISTANCE;
                positionTransform3D.set(new Vector3f(x, y, z));
                positionTransform3D.mul(angleTransform3D);
                  transformGroup.setTransform( positionTransform3D );
            */

            Transform3D temp = new Transform3D();
            transformGroup.getTransform(temp);
            y = y + DISTANCE;
            positionTransform3D.set(new Vector3f(x, y, z));
            positionTransform3D.mul(temp);
            transformGroup.setTransform( positionTransform3D );
        }
        else if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            y = y - DISTANCE;
            positionTransform3D.set(new Vector3f(x, y, z));
            positionTransform3D.mul(angleTransform3D);
              transformGroup.setTransform( positionTransform3D );
        }
        else if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            angle = angle + TURNANGLE;
            angleTransform3D.rotZ(TURNANGLE);
            positionTransform3D.mul(angleTransform3D);
            transformGroup.setTransform( positionTransform3D );
        }
        else if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            angle = angle - TURNANGLE;
            angleTransform3D.rotZ(-TURNANGLE);
            positionTransform3D.mul(angleTransform3D);
            transformGroup.setTransform( positionTransform3D );
        }
    }

    public void keyReleased(KeyEvent e)
    {
    }

    public static void main(String[] args)
    {
        Frame frame = new MainFrame(new Test(), 600, 400);
    }
}
Avatar billede soreno Praktikant
16. oktober 2003 - 16:40 #1
There are some good examples with the java3D package.

This:
c:\path_to_java\demo\java3d\HelloUniverse

Rotates a cube.
Avatar billede fredand Forsker
16. oktober 2003 - 16:51 #2
Hello!

Yes but I have not found any examples where they both move (x,y,z) it and rotate it.

Have you?
Fredrik
Avatar billede fredand Forsker
03. november 2003 - 10:13 #3
Hello!

I got some help at java developer forum, so now my solution looks like below:
package java3d;

import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;

public class TestListener implements KeyListener
{
    final static float DISTANCE     = 0.1f;
    final static double TURNANGLE     = 0.1;
    float x = 0.0f;
    float y = 2.0f;
    float z = -20.0f;
    private double angle = 0.0;

    TransformGroup transformGroup;
    Transform3D positionTransform3D = new Transform3D();
    Transform3D angleTransform3D = new Transform3D();

    public TestListener(TransformGroup tfg)
    {
        transformGroup = tfg;
        positionTransform3D.set(new Vector3f(x, y, z));
        //positionTransform3D.mul(angleTransform3D);
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            Transform3D temp = new Transform3D();
            temp.set(new Vector3f(0, DISTANCE, 0));
            positionTransform3D.mul(temp);
            transformGroup.setTransform( positionTransform3D );
        }
        else if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            Transform3D temp = new Transform3D();
            temp.set(new Vector3f(0, -DISTANCE, 0));
            positionTransform3D.mul(temp);
            transformGroup.setTransform( positionTransform3D );
        }
        else if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            angle = angle + TURNANGLE;
            angleTransform3D.rotZ(TURNANGLE);
            positionTransform3D.mul(angleTransform3D);
            transformGroup.setTransform( positionTransform3D );
        }
        else if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            angle = angle - TURNANGLE;
            angleTransform3D.rotZ(-TURNANGLE);
            positionTransform3D.mul(angleTransform3D);
            transformGroup.setTransform( positionTransform3D );
        }
    }

    public void keyReleased(KeyEvent e)
    {
    }

    public static void main(String[] args)
    {
        Frame frame = new MainFrame(new Test(), 600, 400);
    }
}
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