I'm trying to get these class work, but it doesn't!
Can somebody please wite me a small "demo/example" how to do it right ?
Maybe how to rotate a box withthe attachet class :-)
The Behavio class isn't mine, just found it on the net. But I can't make
it work ... the KEY events seem never to be called.... nothing is moving
:-((
/** KeyBehavior is a generic behavior class to take key presses and move a
* TransformGroup through a Java3D scene. The actions resulting from the key strokes
* are modified by using the Ctrl, Alt and Shift keys.
*
* (version 1.0) reconstructed class to make more generic.
*
* MODIFIED:
* @version 1.0, 25 September 1998 aajc
* @author Andrew AJ Cain, Swinburne University, Australia
* <[EMAIL PROTECTED]>
*
* @edited from code by:
* Gary S. Moss <[EMAIL PROTECTED]>
* U. S. Army Research Laboratory
*
* CLASS NAME:
* KeyBehavior
*
* PUBLIC FEATURES:
* // Data
*
* // Constructors
*
* // Methods:
*
* COLLABORATORS:
*
*/
import java.awt.AWTEvent;
import java.awt.event.*;
import java.util.Enumeration;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class KeyBehavior extends Behavior
{
protected static final double FAST_SPEED = 2.0;
protected static final double NORMAL_SPEED = 1.0;
protected static final double SLOW_SPEED = 0.5;
private TransformGroup transformGroup;
private Transform3D transform3D;
private WakeupCondition keyCriterion;
private final static double TWO_PI = (2.0 * Math.PI);
private double rotateXAmount = Math.PI / 16.0;
private double rotateYAmount = Math.PI / 16.0;
private double rotateZAmount = Math.PI / 16.0;
private double moveRate = 0.3;
private double speed = NORMAL_SPEED;
private int forwardKey = KeyEvent.VK_UP;
private int backKey = KeyEvent.VK_DOWN;
private int leftKey = KeyEvent.VK_LEFT;
private int rightKey = KeyEvent.VK_RIGHT;
public KeyBehavior( TransformGroup tg )
{
super();
transformGroup = tg;
transform3D = new Transform3D();
}
public void initialize()
{
WakeupCriterion[] keyEvents = new WakeupCriterion[2];
keyEvents[0] = new WakeupOnAWTEvent( KeyEvent.KEY_PRESSED );
keyEvents[1] = new WakeupOnAWTEvent( KeyEvent.KEY_RELEASED );
keyCriterion = new WakeupOr( keyEvents );
wakeupOn( keyCriterion );
}
public void processStimulus( Enumeration criteria )
{
WakeupCriterion wakeup;
AWTEvent[] event;
while( criteria.hasMoreElements() )
{
wakeup = (WakeupCriterion) criteria.nextElement();
if( !(wakeup instanceof WakeupOnAWTEvent) )
continue;
event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
for( int i = 0; i < event.length; i++ )
{
if( event[i].getID() == KeyEvent.KEY_PRESSED )
{
processKeyEvent((KeyEvent)event[i]);
}
}
}
wakeupOn( keyCriterion );
}
protected void processKeyEvent(KeyEvent event)
{
int keycode = event.getKeyCode();
if(event.isShiftDown()) speed = FAST_SPEED;
else speed = NORMAL_SPEED;
if( event.isAltDown() )
altMove(keycode);
else if( event.isControlDown())
controlMove(keycode);
else
standardMove(keycode);
}
//moves forward backward or rotates left right
private void standardMove(int keycode)
{
if(keycode == forwardKey)
moveForward();
else if(keycode == backKey)
moveBackward();
else if(keycode == leftKey)
rotLeft();
else if(keycode == rightKey)
rotRight();
}
//moves left right, rotate up down
protected void altMove(int keycode)
{
if(keycode == forwardKey)
rotUp();
else if(keycode == backKey)
rotDown();
else if(keycode == leftKey)
moveLeft();
else if(keycode == rightKey)
moveRight();
}
//move up down, rot left right
protected void controlMove(int keycode)
{
if(keycode == forwardKey)
moveUp();
else if(keycode == backKey)
moveDown();
else if(keycode == leftKey)
rollLeft();
else if(keycode == rightKey)
rollRight();
}
private void moveForward()
{
doMove(new Vector3d(0.0,0.0, -getMovementRate()));
}
private void moveBackward()
{
doMove(new Vector3d(0.0,0.0, getMovementRate()));
}
private void moveLeft()
{
doMove(new Vector3d( -getMovementRate() ,0.0,0.0));
}
private void moveRight()
{
doMove(new Vector3d(getMovementRate(),0.0,0.0));
}
private void moveUp()
{
doMove(new Vector3d(0.0, getMovementRate() ,0.0));
}
private void moveDown()
{
doMove(new Vector3d(0.0, -getMovementRate() ,0.0));
}
protected void rotRight()
{
doRotateY(getRotateRightAmount());
}
protected void rotUp()
{
doRotateX(getRotateUpAmount());
}
protected void rotLeft()
{
doRotateY(getRotateLeftAmount());
}
protected void rotDown()
{
doRotateX(getRotateDownAmount());
}
protected void rollLeft()
{
doRotateZ(getRollLeftAmount());
}
protected void rollRight()
{
doRotateZ(getRollRightAmount());
}
protected void doRotateY(double radians)
{
transformGroup.getTransform(transform3D);
Transform3D toMove = new Transform3D();
toMove.rotY(radians);
transform3D.mul(toMove);
transformGroup.setTransform(transform3D);
}
protected void doRotateX(double radians)
{
transformGroup.getTransform(transform3D);
Transform3D toMove = new Transform3D();
toMove.rotX(radians);
transform3D.mul(toMove);
transformGroup.setTransform(transform3D);
}
protected void doRotateZ(double radians)
{
transformGroup.getTransform(transform3D);
Transform3D toMove = new Transform3D();
toMove.rotZ(radians);
transform3D.mul(toMove);
transformGroup.setTransform(transform3D);
}
protected void doMove(Vector3d theMove)
{
transformGroup.getTransform(transform3D);
Transform3D toMove = new Transform3D();
toMove.setTranslation(theMove);
transform3D.mul(toMove);
transformGroup.setTransform(transform3D);
}
protected double getMovementRate()
{
return moveRate * speed;
}
protected double getRollLeftAmount()
{
return rotateZAmount * speed;
}
protected double getRollRightAmount()
{
return -rotateZAmount * speed;
}
protected double getRotateUpAmount()
{
return rotateYAmount * speed;
}
protected double getRotateDownAmount()
{
return -rotateYAmount * speed;
}
protected double getRotateLeftAmount()
{
return rotateYAmount * speed;
}
protected double getRotateRightAmount()
{
return -rotateYAmount * speed;
}
public void setRotateXAmount(double radians)
{
rotateXAmount = radians;
}
public void setRotateYAmount(double radians)
{
rotateYAmount = radians;
}
public void setRotateZAmount(double radians)
{
rotateZAmount = radians;
}
public void setMovementRate(double meters)
{
moveRate = meters; // Travel rate in meters/frame
}
public void setForwardKey(int key)
{
forwardKey = key;
}
public void setBackKey(int key)
{
backKey = key;
}
public void setLeftKey(int key)
{
leftKey = key;
}
public void setRightKey(int key)
{
rightKey = key;
}
}