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);
}
}