Next step is to define a dummy node for your avatar and attach to the collision system and your scene:
// build a dummy node to represent the avatar for collision and movement
// purposes. we do this by creating a branch group with set bounds around an
// avatar of 1.83 meters high. Then we make a collider node of an ellipsoid which is
// half as wide as it is tall.
MovementForce force = new MovementForce();
TransformGroup aTG = new TransformGroup();
Node n = new BranchGroup();
n.setBoundsAutoCompute(false);
n.setBounds(new BoundingSphere(new Point3f(0, 0.915f, 0), 0.915f));
aTG.addChild(n);
converter.getRoot().addChild(aTG);
avatarNode = new ColliderNode(n, ColliderNode.CT_ELLIPSOID, ColliderNode.CT_ELLIPSOID, true, new Coord3f(0.5f, 1, 0.5f));
cs.addCollider(avatarNode);
// now make a force for the collider which controlls movement
avatarNode.addForce(force);
Then you need to capture your AWT events and use them to modify your force:
class KeyboardEventListener implements AWTEventListener {
public void eventDispatched(AWTEvent event) {
if (event instanceof KeyEvent) {
KeyEvent e = (KeyEvent) event;
if ((e.getID() == KeyEvent.KEY_TYPED) && (e.getKeyChar() == '-')) {
takeScreenshot=true;
}
if ((e.getID() == KeyEvent.KEY_TYPED) && (e.getKeyChar() == 27)) {
System.exit(0);
e.consume();
}
// turning right
else if ((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_RIGHT)) {
force.turnRight();
e.consume();
} else if ((e.getID() == KeyEvent.KEY_RELEASED) && (e.getKeyCode() == KeyEvent.VK_RIGHT)) {
force.turnStop();
e.consume();
}
// turning left
else if ((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_LEFT)) {
force.turnLeft();
e.consume();
} else if ((e.getID() == KeyEvent.KEY_RELEASED) && (e.getKeyCode() == KeyEvent.VK_LEFT)) {
force.turnStop();
e.consume();
}
// turning forward
else if ((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_UP)) {
force.setSpeed(4f);
e.consume();
} else if ((e.getID() == KeyEvent.KEY_RELEASED) && (e.getKeyCode() == KeyEvent.VK_UP)) {
force.setSpeed(0);
e.consume();
}
else if ((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_DOWN)) {
force.setSpeed(-4f);
e.consume();
} else if ((e.getID() == KeyEvent.KEY_RELEASED) && (e.getKeyCode() == KeyEvent.VK_DOWN)) {
force.setSpeed(0);
e.consume();
}
// go down
else if ((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_DELETE)) {
force.fallDown();
e.consume();
} else if ((e.getID() == KeyEvent.KEY_RELEASED) && (e.getKeyCode() == KeyEvent.VK_DELETE)) {
force.fallNone();
e.consume();
}
// go up
else if ((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_INSERT)) {
force.fallUp();
e.consume();
} else if ((e.getID() == KeyEvent.KEY_RELEASED) && (e.getKeyCode() == KeyEvent.VK_INSERT)) {
force.fallNone();
e.consume();
}
// gravity
else if ((e.getID() == KeyEvent.KEY_TYPED) && (e.getKeyChar()=='g')) {
force.toggleGravity();
e.consume();
}
else if ((e.getID() == KeyEvent.KEY_TYPED) && (e.getKeyChar()==' ')) {
force.jump();
e.consume();
}
}
}
}
Toolkit.getDefaultToolkit().addAWTEventListener(
new KeyboardEventListener(),
AWTEvent.KEY_EVENT_MASK);
Then in your renderer loop you let the collision system handle the avatar and then sync the view.
cs.newFrame(deltaTime);
force.updateView(avatarNode, view, deltaTime);
view.renderOnce();
Thats it!
You can check out the Quake 3 demo I just posted to see this work and to study the complete source code.