233 lines
8.4 KiB
Java
233 lines
8.4 KiB
Java
/*
|
|
File: FollowCelestialObject.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/FollowCelestialObject.java,v 1.11 2000/12/13 13:43:41 portm Exp $
|
|
$Author: portm $
|
|
$Date: 2000/12/13 13:43:41 $
|
|
$State: Exp $
|
|
|
|
*/
|
|
package sss3d.viewbranch;
|
|
|
|
import sss3d.SolarSystemSimulator;
|
|
import sss3d.utils.SSS3dConstants;
|
|
import sss3d.utils.xmlparser.XMLConstants;
|
|
|
|
import java.util.Enumeration;
|
|
import javax.vecmath.*;
|
|
import javax.media.j3d.*;
|
|
|
|
/**
|
|
* This class follow a celestial object.
|
|
*
|
|
* @author Marcel Portner & Bernhard Hari
|
|
* @version $Revision: 1.11 $
|
|
*/
|
|
public class FollowCelestialObject extends Behavior {
|
|
|
|
/**
|
|
* The TransformGroup node to follow the celestial object.
|
|
*/
|
|
private TransformGroup new_tgView;
|
|
|
|
/**
|
|
* The reference to the main class.
|
|
*/
|
|
private SolarSystemSimulator sss3d;
|
|
|
|
/**
|
|
* Wake up event for each new frame.
|
|
*/
|
|
private WakeupOnElapsedFrames wakeUp = new WakeupOnElapsedFrames(0);
|
|
|
|
/**
|
|
* Constructor that allows to specify the desired target transform group.
|
|
*
|
|
* @param targetTG the target transform group
|
|
* @param sss3d reference to the main class
|
|
*/
|
|
public FollowCelestialObject(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 for each new frame and
|
|
* operates on the specified transform group to follow an object with the camera.
|
|
*
|
|
* @param criteria an enumeration of triggered wakeup criteria for this behavior.
|
|
*/
|
|
public void processStimulus(Enumeration criteria) {
|
|
|
|
if(criteria.hasMoreElements()) {
|
|
Transform3D followObject = sss3d.lnkSceneSolarSystem.getCurrentPosition();
|
|
|
|
boolean follow = !((Boolean)sss3d.getInitializationObject().getParameter(XMLConstants.CAMERAATORIGIN)).booleanValue();
|
|
boolean compressed = ((Boolean)sss3d.getInitializationObject().getParameter(XMLConstants.COMPRESSED)).booleanValue();
|
|
|
|
// Default camera position
|
|
if(followObject == null) {
|
|
// rotate about 270 degree at the X - axis
|
|
Matrix3d rot = new Matrix3d();
|
|
rot.rotX(Math.toRadians(270));
|
|
|
|
Vector3d trans;
|
|
if(compressed) {
|
|
trans = new Vector3d(0.0, 70.0, 0.0);
|
|
} else {
|
|
trans = new Vector3d(0.0, 1000.0, 0.0);
|
|
}
|
|
followObject = new Transform3D(rot, trans, 1.0);
|
|
} else if(follow) {
|
|
// Give an offset.
|
|
Vector3d offset = new Vector3d();
|
|
|
|
int camera = ((Integer)sss3d.getInitializationObject().getParameter(XMLConstants.CAMERA)).intValue();
|
|
|
|
switch(camera) {
|
|
case SSS3dConstants.CAMERA_SUN :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 11.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 500.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_MERCURY :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 5.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_VENUS :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 9.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_EARTH :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 10.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_MARS :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 9.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_JUPITER :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 8.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 40.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_SATURN :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 9.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 45.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_URANUS :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 25.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_NEPTUNE :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 25.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_PLUTO :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 5.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_MOON :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 5.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
case SSS3dConstants.CAMERA_SPACESHUTTLE :
|
|
Matrix3d m3dRot = new Matrix3d();
|
|
Vector3d v3dTemp = new Vector3d();
|
|
followObject.get(m3dRot);
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
m3dRot.transform(new Vector3d(0.0, 0.02, 0.1), v3dTemp);
|
|
} else {
|
|
m3dRot.transform(new Vector3d(0.0, 0.2, 1.0), v3dTemp);
|
|
}
|
|
offset.add(v3dTemp);
|
|
followObject.setTranslation(offset);
|
|
break;
|
|
default :
|
|
followObject.get(offset);
|
|
if(compressed) {
|
|
offset.add(new Vector3d(0.0, 0.0, 2.0));
|
|
} else {
|
|
offset.add(new Vector3d(0.0, 0.0, 5.0));
|
|
}
|
|
followObject.set(offset);
|
|
break;
|
|
}
|
|
}
|
|
new_tgView.setTransform(followObject);
|
|
}
|
|
|
|
// Set wakeup criteria for next time.
|
|
wakeupOn(wakeUp);
|
|
}
|
|
}
|