Java 3D
Java3D (J3D)
- Vorraussetzungen
- Grundgeometrien
- Verschieben
- Appearance + Texturen
- Betrachten mit Hilfe der Maus
- Licht
- Manipulieren von Objekten mit der Maus
- Beispiel: Würfel
- Beispiel: Spielbrett
Vorraussetzungen und Installation von Java 3D
java3d-1_2_1_04-win32-opengl-sdk.exe von der sun seite, bzw. ein anderes java3d (j3d) instalieren. wenn es nicht funktioniert Pfade setzten.Tutorials gibts (auch) unter http://www.web3d.org nach oben
Grundcode für J3D
Der folgende Code ist eine Art Grundgerüst, den man für die meisten Java3d Anwendungen so übernehmen kann: public class Welt extends Frame {
public Welt (String title) {
super(title);
// AnzeigeInfos holen (Farbtiefe, usw...
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
// ein neues Canvas mit den AnzeigeInfos erzeugen und dem Frame hinzufügen
Canvas3D canvas3d = new Canvas3D (config);
add(canvas3d);
// ein neues Universum im Canvas erzeugen und eine Betrachtungsebene erzeugen
SimpleUniverse universe = new SimpleUniverse(canvas3d);
universe.getViewingPlatform().setNominalViewingTransform();
// ein kleiner Würfel
ColorCube colorcube = new ColorCube();
// neue Transform Informationen
Transform3D transform3d = new Transform3D();
// neue Transformgruppe
TransformGroup transroot = new TransformGroup(transform3d);
//colorcube an Transformgruppe hängen
transroot.addChild(colorcube);
//neue Branchgruppe
BranchGroup branchgroup = new BranchGroup();
//Transformgruppe an Branchgruppe hängen
branchgroup.addChild(transroot);
// ... an das Universum hängen
universe.addBranchGraph(branchgroup);
}
public static void main(String args[]) {
Welt beispiel = new Welt("Beispie");
beispiel.setSize(600,400);
beispiel.setVisible(true);
}
}
An das SimpleUniverse> wird immer die Branchgroup gehängt, ansonsten habe ich es
bis jetzt noch nicht verwenden müssen.An die BranchGroup wird eine TransfromGroup und eventuell dinge, die für den ganzen Graphen gelten, wie z.B. Licht gehängt
An eine Transfromgroup können weitere Transfromgroups, Geometrien, Mouseereignisse u. ä. gehängt werden. Jede Transfromgruppe hat ihr eigenes relatives Coordinatensystem. ColorCube ist ein vorgefertigter, bunter Würfel der wohl hauptsächlich zum Ausprobieren dient.
Beim Anhängen wird der entsprechende Knoten kopiert! d.h. eine Änderung von z.B. colorcube hat nach blah.addChild(colorcube) keine Wirkung mehr auf die Ausgabe.
nach oben
Grundgeometrien in Java3D
Folgende Grundformen gibt es:- Box()
Constructs a default box of 2.0 meters in height, width, and depth, centered at the origin.
Box(float xdim, float ydim, float zdim, Appearance appearance)
Constructs a box of a given dimension and appearance, centered at the origin.
- Cone()
Constructs a default Cone of radius of 1.0 and height of 2.0.
Cone(float radius, float height)
Constructs a default Cone of a given radius and height. - Sphere()
Constructs a default Sphere of radius of 1.0.
Sphere(float radius)
Constructs a default Sphere of a given radius. - Cylinder()
Constructs a default cylinder of radius of 1.0 and height of 2.0.
Cylinder(float radius, float height)
Constructs a cylinder of a given radius and height.
Verschieben + Rotieren von 3D Objekten in Java
// 1. Würfel
ColorCube colorcube1 = new ColorCube();
// neue Transform Informationen
Transform3D transform3d = new Transform3D();
// Rotation um Y- Achse
transform3d.rotY (Math.toRadians(30));
//Verschiebung um Vector
transform3d.setTranslation(new Vector3f(2,2,2));
// neue Transformgruppe
TransformGroup transcube1 = new TransformGroup(transform3d);
//colorcube an Transformgruppe hängen
transcube1.addChild(colorcube1);
// 2. Würfel
ColorCube colorcube2 = new ColorCube();
// neue Transform Informationen
transform3d = new Transform3D();
transform3d.rotX (Math.toRadians(30));
// Rotation um X- Achse
transform3d.rotZ (Math.toRadians(15));
// Rotation um Z- Achse
// neue Transformgruppe
TransformGroup transcube2 = new TransformGroup(transform3d);
//colorcube an Transformgruppe hängen
transcube2.addChild(colorcube2);
// neue Transform Informationen
Transform3D transform3d = new Transform3D();
// neue Transformgruppe
TransformGroup transroot = new TransformGroup(transform3d);
//transcube1 an Transformgruppe hängen
transroot.addChild(transcube1);
transroot.addChild(transcube2);
nach oben
Appearance + Texturen / Texturemapping in J3D
Die Appearance definiert Farben und ähnliches der Geometrie.
//neue Appearance erzeugen
Appearance app = new Appearance();
//Farben setzten
app.setColoringAttributes(new ColoringAttributes(1, 1, 1, 0));
//neues Material
Material mat = new Material();
//Material setztzen, sonst reagiert Geometrie später nicht auf extra-Licht
mat.setDiffuseColor(1, 1, 1, 0);
app.setMaterial(mat);
Cone cone = new Cone(0.05f,0.1f,Cone.GENERATE_NORMALS, app);
Die folgende Function gibt eine Appearance zurück, deren Texture die Datei mit namen/Pfad s ist.Eine Geometrie muss dann so iitialisiert werden:
Box cube1 = new Box(x, y, z, Primitive.GENERATE_TEXTURE_COORDS + Box.GENERATE_NORMALS, texture("abc.jpg"));
Laut API kann man viele Grafikformate benutzen. Ich habe .gif und .jpg ausprobiert.
public Appearance texture(String s) {
TextureLoader loader = new TextureLoader(s, this);
ImageComponent2D image = loader.getImage();
Texture2D texture = new Texture2D();
int form = texture.getFormat();
int base = texture.getMipMapMode();
texture = new Texture2D(base,form,512,512);
texture.setImage(0, image);
Appearance appear = new Appearance();
appear.setTexture(texture);
TextureAttributes texat = new TextureAttributes(TextureAttributes.MODULATE,new Transform3D(),new Color4f(),TextureAttributes.NICEST);
appear.setTextureAttributes(texat);
appear.setMaterial(new Material());
return(appear);
}
Fragt mich aber jetzt nicht, was das im Einzelnen macht. Als es nach X Stunden rumprobieren endlich funktionierte war ich froh...
Häufiges Laden von Texturen geht auf die Geschwindigkeit. benutzt man die selbe Textur mehrere Male sollte man sich die Appearance einmal deffinieren und merken.
nach oben
Betrachten mit Hilfe der Maus
//Bounds inherhalb derer das Behaviour gelten soll
BoundingBox boundBox = new BoundingBox(new Point3d(-10, -10, -10), new Point3d(10, 10, 10));
// Muss gesetzt werden um das Betrachten mit der Maus zu erlauben
transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//rotieren mit der linken Maustaste
MouseRotate behavior = new MouseRotate(transformgroup);
behaviour.setSchedulingBounds(boundBox);
transformgroup.addChild(behavior);
//zoomen mit der mitleren Maustaste
MouseZoom mouseBeh2 = new MouseZoom(transformgroup);
mouseBeh2.setSchedulingBounds(boundBox);
transformgroup.addChild(mouseBeh2);
//verschieben mit der rechten Maustaste
MouseTranslate mouseBeh3 = new MouseTranslate(transformgroup);
mouseBeh3.setSchedulingBounds(boundBox);
transformgroup.addChild(mouseBeh3);
nach oben
Licht, Lichtquellen und Beleuchtung in Java3D
AmbientLight lightA = new AmbientLight();
lightA.setInfluencingBounds(new BoundingSphere());
branchgroup.addChild(lightA);
DirectionalLight lightD1 = new DirectionalLight();
lightD1.setInfluencingBounds(new BoundingSphere());
branchgroup.addChild(lightD1);
Licht funktioniert nur wenn Material der Geometrien spezifiziert ist. Es wird immer an die Branchgroup gehängt. nach oben
Manipulieren von Objekten mit der Maus in Java 3D
Die folgende Funktion macht eine Transformgruppe bereit manipuliert zu werden
public void apick( TransformGroup t) {
t.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
t.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
t.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
}
Behaviours definieren
//Bounds inerhalb deren man sich befinden muss
BoundingSphere behaveBounds = new BoundingSphere();
//Rotieren mit rechts
PickRotateBehavior pickr = new PickRotateBehavior(branch,canvas3d, behaveBounds);
branch.addChild(pickr);
//Verschieben mit links
PickTranslateBehavior pickt = new PickTranslateBehavior(branch,canvas3d, behaveBounds);
branch.addChild(pickt);
//Zoom mit beiden
PickZoomBehavior pickz = new PickZoomBehavior(branch,canvas3d, behaveBounds);
branch.addChild(pickz);
Reagieren auf Änderungen:
PickTranslateBehavior pickt = new PickTranslateBehavior(branch,canvas3d, behaveBounds);
branch.addChild(pickt);
PickingCallback myCallback = new MyCallbackClass();
// Register the class callback to be called
pickt.setupCallback(myCallback);
und die Zugehörige Klasse:
public class MyCallbackClass extends Object implements PickingCallback{
public void transformChanged(int type, TransformGroup tg) {
System.out.println("pick");
}
}
nach oben
Beispiel: Würfel
Autor : Hannes
Welt.Java
nach oben
Beispiel: Spielbrett
Autor : Lina