csharp_pain/Solar system/sss3d-source/sss3d/viewbranch/ViewBranch.java
2014-06-26 17:13:46 +02:00

184 lines
6.4 KiB
Java

/*
File: ViewBranch.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/ViewBranch.java,v 1.13 2000/12/13 13:44:36 portm Exp $
$Author: portm $
$Date: 2000/12/13 13:44:36 $
$State: Exp $
*/
package sss3d.viewbranch;
import sss3d.utils.SSS3dConstants;
import sss3d.SolarSystemSimulator;
import sss3d.utils.xmlparser.XMLConstants;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.keyboard.*;
/**
* This class creates all necessary objects on the "View Branch"
* side of the scene graph.
*
* @author Marcel Portner & Bernhard Hari
* @version $Revision: 1.13 $
*/
public class ViewBranch extends Object {
private Canvas3D canvasL;
private Canvas3D canvasR;
private SolarSystemSimulator sss3d;
private PhysicalEnvironment environment;
private TransformGroup vpTrGrKey;
private KeyNavigation keyNav;
/**
* Initializes a new ViewBranch that allows to specify the desired Canvas3D.
*
* @param sss3d reference to the main class
* @param canvasL the Canvas3D being used for the left eye or the default
* @param canvasR the Canvas3D being used for the right eye or null
*/
public ViewBranch(SolarSystemSimulator sss3d, Canvas3D canvasL, Canvas3D canvasR) {
this.canvasL = canvasL;
this.canvasR = canvasR;
this.sss3d = sss3d;
}
/**
* Give the physical environment.
*
* @return the physical environment.
*/
public PhysicalEnvironment getPhysicalEnvironment() {
return environment;
}
/**
* Create the ViewBranch.
*
* @return the root of the ViewBranch.
*/
public BranchGroup myViewBranch() {
// Create the minimal PhysicalBody and PhysicalEnvironnement
// instances with default parameters.
PhysicalBody body = new PhysicalBody();
environment = new PhysicalEnvironment();
// Create a View instance and attach the Canvas3D, the PhysicalBody
// and the PhysicalEnvironment to it.
View view = new View();
view.addCanvas3D(canvasL);
if(canvasR != null) {
view.addCanvas3D(canvasR);
}
view.setPhysicalBody(body);
view.setPhysicalEnvironment(environment);
/*
//PHYSICAL_EYE, PHYSICAL_SCREEN, VIRTUAL_EYE, or VIRTUAL_SCREEN
view.setFrontClipPolicy(View.PHYSICAL_SCREEN);
view.setBackClipPolicy(View.PHYSICAL_SCREEN);
*/
// set back and front clipping for different views
if ( ((Boolean)sss3d.getObjectsInformation().getParameter(XMLConstants.COMPRESSED)).booleanValue() ) {
view.setFrontClipDistance(SSS3dConstants.FRONTCLIP_COMPRESSED);
view.setBackClipDistance(SSS3dConstants.BACKCLIP_COMPRESSED);
} else {
view.setFrontClipDistance(SSS3dConstants.FRONTCLIP);
view.setBackClipDistance(SSS3dConstants.BACKCLIP);
}
/*
// RELATIVE_TO_SCREEN, RELATIVE_TO_WINDOW, RELATIVE_TO_FIELD_OF_VIEW, RELATIVE_TO_COEXISTENCE
view.setWindowEyepointPolicy(View.RELATIVE_TO_COEXISTENCE);
view.setLeftManualEyeInCoexistence(new Point3d(0.0142, 0.0135, 0.4572));
view.setRightManualEyeInCoexistence(new Point3d(0.0208, 0.0135, 0.4572));
*/
// Create a ViewPlatform instance and bind it with the View instance.
ViewPlatform vp = new ViewPlatform();
// vp.setActivationRadius(SSS3dConstants.VISIBILITY);
view.attachViewPlatform(vp);
// Create the necessary TransformGroup node for the ViewPlatform's
// motion, which is guided by the keys.
vpTrGrKey = new TransformGroup();
// With the ALLOW_TRANSFORM_READ and ALLOW_TRANSFORM_WRITE
// capabilities, we allow the modification of the TransformGroup's
// code by the Behavior's code at run time.
vpTrGrKey.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
vpTrGrKey.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// Attach the ViewPlatform instance to the TransformGroup
// node vpTrGrKey.
vpTrGrKey.addChild(vp);
// View-platform's motion (rotation, zoom and translation)
keyNav = new KeyNavigation(vpTrGrKey, sss3d);
keyNav.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
SSS3dConstants.BOUNDRADIUS));
// Attach the keyNav instance to the TransformGroup
// node vpTrGrKey.
vpTrGrKey.addChild(keyNav);
// Create the necessary TransformGroup node for the ViewPlatform's
// motion, which is guided by the keys.
TransformGroup follow = new TransformGroup();
// With the ALLOW_TRANSFORM_WRITE capabilities, we allow
// the modification of the TransformGroup's code by
// the Behavior's code at run time.
follow.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// Attach the vpTrGrKey instance to the TransformGroup
// node follow.
follow.addChild(vpTrGrKey);
// Create a follow celestial object
FollowCelestialObject fObject = new FollowCelestialObject(follow, sss3d);
fObject.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
SSS3dConstants.BOUNDRADIUS));
// Attach the fObject instance to the TransformGroup
// node follow.
follow.addChild(fObject);
// Add the TransformGroup node vpTrGrKey to the new
// BranchGroup node vbBrGr.
BranchGroup vbBrGr = new BranchGroup();
vbBrGr.addChild(follow);
// Compile the ViewBranch to optimize the performances.
vbBrGr.compile();
// Return the final version of the view branch BranchGroup node vbBrGr.
return vbBrGr;
}
/**
* Set the camera position to the init state.
*/
public void setStartPosition() {
try {
vpTrGrKey.setTransform(new Transform3D());
} catch(CapabilityNotSetException cnse) {
System.out.println("Error: " + cnse.toString());
} catch(BadTransformException bte) {
System.out.println("Error: " + bte.toString());
}
}
}