Java 3D

Java3D (J3D)

nach oben

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.
nach oben

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