import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.behaviors.vp.*;
import javax.swing.JFrame;
import com.sun.j3d.loaders.*;
import com.sun.j3d.loaders.objectfile.*;
import java.util.Hashtable;
/**
* Beispiel fuer das Laden eines geometrischen Objekts, das nicht angezeigt
* wird. Es wird nur ein Teilobjekt aus dem geladenen Objekt dargestellt.
*
* @author Frank Klawonn
* Letzte Aenderung 07.07.2005
*/
public class Extract3DExample extends JFrame
{
//Der Canvas, auf den gezeichnet wird.
public Canvas3D myCanvas3D;
public Extract3DExample()
{
//Mechanismus zum Schliessen des Fensters und beenden des Programms
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Standardeinstellung fuer das Betrachteruniversum
myCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
//Aufbau des SimpleUniverse:
//Zuerst Erzeugen zusammen mit dem Canvas
SimpleUniverse simpUniv = new SimpleUniverse(myCanvas3D);
//Standardpositionierung des Betrachters
simpUniv.getViewingPlatform().setNominalViewingTransform();
//Die Szene wird in dieser Methode erzeugt.
createSceneGraph(simpUniv);
//Hinzufuegen von Licht
addLight(simpUniv);
//Hierdurch kann man mit der Maus den Betrachterstandpunkt veraendern
OrbitBehavior ob = new OrbitBehavior(myCanvas3D);
ob.setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE));
simpUniv.getViewingPlatform().setViewPlatformBehavior(ob);
//Darstellung des Canvas/Fensters:
setTitle("Ein aus einer Datei geladenes Objekt");
setSize(700,700);
getContentPane().add("Center", myCanvas3D);
setVisible(true);
}
public static void main(String[] args)
{
Extract3DExample e3de = new Extract3DExample();
}
//In dieser Methode werden die Objekte der Szene aufgebaut und dem
//SimpleUniverse su hinzugefuegt.
public void createSceneGraph(SimpleUniverse su)
{
//Laden einer obj-Datei:
ObjectFile f = new ObjectFile(ObjectFile.RESIZE);
Scene s = null;
try
{
s = f.load("schiff.obj");
}
catch (Exception e)
{
System.out.println("File loading failed:" + e);
}
//Auswaehlen des Teilobjekts
Hashtable namedObjects = s.getNamedObjects();
Shape3D partOfTheObject = (Shape3D) namedObjects.get("schiffsrumpf");
//Erstellen einer Kopie des ausgewaehlten Teilobjekts
Shape3D extractedObject = (Shape3D) partOfTheObject.cloneTree();
//Einfaerben des Teilobjekts in Blau
Appearance lightBlueApp = new Appearance();
setToMyDefaultAppearance(lightBlueApp,new Color3f(0.0f,0.1f,0.3f));
extractedObject.setAppearance(lightBlueApp);
//Zuordnen des eingefaerbten Teilobjekts zu einer Transformationsgruppe
Transform3D tfObject = new Transform3D();
tfObject.rotZ(0.4*Math.PI);
Transform3D xRotation = new Transform3D();
xRotation.rotY(0.4*Math.PI);
tfObject.mul(xRotation);
TransformGroup tgObject = new TransformGroup(tfObject);
tgObject.addChild(extractedObject);
BranchGroup theScene = new BranchGroup();
//Hinzufuegen der transformationsgruppe mit dem blauen Teilobjekt zur Szene
theScene.addChild(tgObject);
//Die folgenden drei Zeilen erzeugen einen weißen Hintergrund.
Background bg = new Background(new Color3f(1.0f,1.0f,1.0f));
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE);
bg.setApplicationBounds(bounds);
theScene.addChild(bg);
theScene.compile();
//Hinzufuegen der Szene
su.addBranchGraph(theScene);
}
/**
* Erzeugt eine Standardoberflaechenstruktur in einer gewuenschten Farbe
*
* @param app Die Appearance, mit der die Oberflaeche belegt werden soll
* @param col Die gewuenschte Farbe
*/
public static void setToMyDefaultAppearance(Appearance app, Color3f col)
{
app.setMaterial(new Material(col,col,col,col,120.0f));
}
//Hier wird etwas Licht zu der Szene hinzugefuegt.
public void addLight(SimpleUniverse su)
{
BranchGroup bgLight = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
Color3f lightColour1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lightDir1 = new Vector3f(-1.0f,0.0f,-0.5f);
DirectionalLight light1 = new DirectionalLight(lightColour1, lightDir1);
light1.setInfluencingBounds(bounds);
bgLight.addChild(light1);
su.addBranchGraph(bgLight);
}
}