265 lines
8.8 KiB
Java
265 lines
8.8 KiB
Java
/*
|
|
File: KeyNavigation.java
|
|
|
|
University of Applied Science Berne,HTA-Biel/Bienne,
|
|
Computer Science Department.
|
|
|
|
Diploma thesis J3D Solar System Simulator
|
|
Originally written by Marcel Portner & Bernhard Hari (c) 2000
|
|
|
|
CVS - Information :
|
|
|
|
$Header: /var/cvsreps/projects/c450/2000/sss3d/source_diploma/sss3d/viewbranch/KeyNavigation.java,v 1.12 2000/12/15 02:58:25 portm Exp $
|
|
$Author: portm $
|
|
$Date: 2000/12/15 02:58:25 $
|
|
$State: Exp $
|
|
|
|
*/
|
|
package sss3d.viewbranch;
|
|
|
|
import sss3d.SolarSystemSimulator;
|
|
|
|
import java.awt.AWTEvent;
|
|
import java.util.Enumeration;
|
|
import java.awt.event.*;
|
|
import javax.vecmath.*;
|
|
import javax.media.j3d.*;
|
|
|
|
/**
|
|
* This class is a keyboard behavior to control the navigation
|
|
* of the view (camera).
|
|
*
|
|
* @author Marcel Portner & Bernhard Hari
|
|
* @version $Revision: 1.12 $
|
|
*/
|
|
public class KeyNavigation extends Behavior {
|
|
|
|
/**
|
|
* The reference to the main class.
|
|
*/
|
|
private SolarSystemSimulator sss3d;
|
|
|
|
/**
|
|
* The TransformGroup node to modify by the keyboard interaction.
|
|
*/
|
|
private TransformGroup new_tgView;
|
|
|
|
/**
|
|
* Wake up event when a key is pressed.
|
|
*/
|
|
private WakeupOnAWTEvent wakeUp = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
|
|
|
|
/**
|
|
* The angle to turn when the directionkeys are pressed
|
|
*/
|
|
private static final float ANGLE = (float) Math.PI / 100;
|
|
|
|
/**
|
|
* The step size to move when a direction key is pressed
|
|
*/
|
|
private static final float F1_STEP = 0.01f;
|
|
private static final float F2_STEP = 0.1f;
|
|
private static final float F3_STEP = 1.0f;
|
|
private static final float F4_STEP = 10.0f;
|
|
private float step = F3_STEP;
|
|
|
|
private Transform3D t3dView = new Transform3D();
|
|
private Transform3D t3dRot = new Transform3D();
|
|
private Vector3f v3fTrans = new Vector3f();
|
|
private Vector3f v3fTemp = new Vector3f();
|
|
private Matrix3f m3fRot = new Matrix3f();
|
|
|
|
/**
|
|
* The turn or move modus
|
|
*/
|
|
private boolean turn = false;
|
|
|
|
/**
|
|
* Constructor that allows to specify the desired target transform group.
|
|
*
|
|
* @param targetTG the target transform group
|
|
* @param sss3d reference to the main class
|
|
*/
|
|
public KeyNavigation(TransformGroup targetTG, SolarSystemSimulator sss3d) {
|
|
new_tgView = targetTG;
|
|
this.sss3d = sss3d;
|
|
}
|
|
|
|
/**
|
|
* Override Behavior's initialize method to setup wakeup criteria.
|
|
*/
|
|
public void initialize() {
|
|
wakeupOn(wakeUp);
|
|
}
|
|
|
|
/**
|
|
* Override Behavior's stimulus method to handle the event.
|
|
* This method is called when a key on the keyboard has been pressed and
|
|
* operates on the specified transform group to move the camera position.
|
|
*
|
|
* @param criteria all pressed keys in a list. This will be passed by the system.
|
|
*/
|
|
public void processStimulus(Enumeration criteria) {
|
|
WakeupOnAWTEvent ev;
|
|
AWTEvent[] events;
|
|
|
|
if(criteria.hasMoreElements()) {
|
|
ev = (WakeupOnAWTEvent) criteria.nextElement();
|
|
events = ev.getAWTEvent();
|
|
KeyEvent eventKey = (KeyEvent) events[0];
|
|
int keyCode = eventKey.getKeyCode();
|
|
|
|
new_tgView.getTransform(t3dView);
|
|
|
|
if(keyCode == KeyEvent.VK_F1) {
|
|
step = F1_STEP;
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.setFactor(1);
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_F2) {
|
|
step = F2_STEP;
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.setFactor(2);
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_F3) {
|
|
step = F3_STEP;
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.setFactor(3);
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_F4) {
|
|
step = F4_STEP;
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.setFactor(4);
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_SPACE) {
|
|
turn = !turn;
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.setNavigationMode();
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_P) {
|
|
if(sss3d.canvas != null) {
|
|
sss3d.canvas.writeJPEG_ = true;
|
|
sss3d.canvas.repaint();
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_G) {
|
|
sss3d.lnkSceneSolarSystem.setAnimation(true, true);
|
|
if(sss3d.lnkInfoBox != null) {
|
|
sss3d.lnkInfoBox.miGo.setEnabled(false);
|
|
sss3d.lnkInfoBox.miStop.setEnabled(true);
|
|
sss3d.lnkInfoBox.miRot.setEnabled(true);
|
|
}
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.startDate();
|
|
}
|
|
} else if(keyCode == KeyEvent.VK_S) {
|
|
sss3d.lnkSceneSolarSystem.setAnimation(false, false);
|
|
if(sss3d.lnkInfoBox != null) {
|
|
sss3d.lnkInfoBox.miGo.setEnabled(true);
|
|
sss3d.lnkInfoBox.miStop.setEnabled(false);
|
|
sss3d.lnkInfoBox.miRot.setEnabled(false);
|
|
}
|
|
if(sss3d.infoPanel != null) {
|
|
sss3d.infoPanel.stopDate();
|
|
}
|
|
} else if(!turn) {
|
|
switch(keyCode) {
|
|
case KeyEvent.VK_UP: // Up arrow - to move up
|
|
t3dView.get(v3fTrans);
|
|
t3dView.get(m3fRot);
|
|
m3fRot.transform(new Vector3f(0.0f, step, 0.0f), v3fTemp);
|
|
v3fTrans.add(v3fTemp); // v3fTemp = result of the product .transform
|
|
t3dView.setTranslation(v3fTrans);
|
|
break;
|
|
|
|
case KeyEvent.VK_DOWN: // Down arrow - to move down
|
|
t3dView.get(v3fTrans);
|
|
t3dView.get(m3fRot);
|
|
m3fRot.transform(new Vector3f(0.0f, -step, 0.0f), v3fTemp);
|
|
v3fTrans.add(v3fTemp);
|
|
t3dView.setTranslation(v3fTrans);
|
|
break;
|
|
|
|
case KeyEvent.VK_RIGHT: // Right arrow - to move right
|
|
t3dView.get(v3fTrans);
|
|
t3dView.get(m3fRot);
|
|
m3fRot.transform(new Vector3f( step, 0.0f, 0.0f), v3fTemp);
|
|
v3fTrans.add(v3fTemp);
|
|
t3dView.setTranslation(v3fTrans);
|
|
break;
|
|
|
|
case KeyEvent.VK_LEFT: // Left arrow - to move left
|
|
t3dView.get(v3fTrans);
|
|
t3dView.get(m3fRot);
|
|
m3fRot.transform(new Vector3f(-step, 0.0f, 0.0f), v3fTemp);
|
|
v3fTrans.add(v3fTemp);
|
|
t3dView.setTranslation(v3fTrans);
|
|
break;
|
|
|
|
case KeyEvent.VK_PAGE_UP: // Page Up - to move forward
|
|
t3dView.get(v3fTrans);
|
|
t3dView.get(m3fRot);
|
|
m3fRot.transform(new Vector3f(0.0f, 0.0f, -step), v3fTemp);
|
|
v3fTrans.add(v3fTemp);
|
|
t3dView.setTranslation(v3fTrans);
|
|
break;
|
|
|
|
case KeyEvent.VK_PAGE_DOWN: // Page Down - to move backward
|
|
t3dView.get(v3fTrans);
|
|
t3dView.get(m3fRot);
|
|
m3fRot.transform(new Vector3f(0.0f, 0.0f, step), v3fTemp);
|
|
v3fTrans.add(v3fTemp);
|
|
t3dView.setTranslation(v3fTrans);
|
|
break;
|
|
|
|
case KeyEvent.VK_HOME: // Home - go to the start position
|
|
t3dView.setIdentity();
|
|
break;
|
|
|
|
default:
|
|
}
|
|
} else {
|
|
switch(keyCode) {
|
|
case KeyEvent.VK_UP: // Up arrow - to turn up
|
|
t3dRot.rotX(-ANGLE);
|
|
t3dView.mul(t3dRot);
|
|
break;
|
|
|
|
case KeyEvent.VK_DOWN: // Down arrow - to turn down
|
|
t3dRot.rotX(ANGLE);
|
|
t3dView.mul(t3dRot);
|
|
break;
|
|
|
|
case KeyEvent.VK_RIGHT: // Right arrow - to turn right
|
|
t3dRot.rotY(-ANGLE);
|
|
t3dView.mul(t3dRot);
|
|
break;
|
|
|
|
case KeyEvent.VK_LEFT: // Left arrow - to turn left
|
|
t3dRot.rotY(ANGLE);
|
|
t3dView.mul(t3dRot);
|
|
break;
|
|
|
|
case KeyEvent.VK_PAGE_UP: // Page Up - to turn
|
|
t3dRot.rotZ(-ANGLE);
|
|
t3dView.mul(t3dRot);
|
|
break;
|
|
|
|
case KeyEvent.VK_PAGE_DOWN: // Page Down - to turn arround
|
|
t3dRot.rotZ(ANGLE);
|
|
t3dView.mul(t3dRot);
|
|
break;
|
|
|
|
case KeyEvent.VK_HOME: // Home - go to the start position
|
|
t3dView.setIdentity();
|
|
break;
|
|
|
|
default:
|
|
}
|
|
}
|
|
new_tgView.setTransform(t3dView);
|
|
}
|
|
|
|
// Set wakeup criteria for next time.
|
|
wakeupOn(wakeUp);
|
|
}
|
|
}
|