# mehrere Graphiken erstellen und ihre Position definieren



## Draco (7. Jan 2004)

Hallo,

ich muß mich im Rahmen einer Projektarbeit mit Java 3D beschäftigen und, da ich blutiger Java-Anfänger bin stehe ich voll auf dem Schlauch.

Ich muß in einer Umgebung mehr oder weniger komplizierte Objekte darstellen. Diese wollte ich nach Möglichkeit auf ihre Grundkörper zurückführen, um der Vektorgrafik aus dem Weg zu gehen. der 2. Grund ist, diese Objekte müssen durch Ereignisse Teilanimiert werden.

*Nun zu meinen Problemen:*

Wie kann ich Objekte wie Cube, Box, ... *frei* in dem Universum platzieren????

Wie kann ich einem Objekt eine Bewegung (horizontale rechts-links-Bewegung) aufzwingen????

Wie kann ich einen Button einfügen, wenn ich gleichzeitig die Funktion Box im Applet verwende???
Die Klassen der Beiden Objekte "beisen" sich....

Wie kann ich diese Bewegung durch einen Mouseclick auf einen Button starten????


Ich bin mir im Klaren darüber, daß dies wirklich viele Fragen sind. Vielleicht könnte ich sie nach langem, langem rätzeln auch selbst lösen, doch ich habe einfach nicht mehr die Nerven dazu... :-(


Anbei schreibe ich mal meinen Quelltext. Vielleicht sind dort ja noch Fehler enthalten, die weitere Probleme nach sich ziehen....

Ich danke euch schon mal recht herzlich im Voraus.

Draco




package festo.distribution;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowAdapter;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class magazin extends Applet {

    float angle = 0.0f;
    Transform3D trans = new Transform3D();

   private SimpleUniverse u = null;

    //Inhaltszweig
    public BranchGroup createSceneGraph() {
        // Kreieren der root des branch graph (Teilbaumgraph)
        BranchGroup objRoot = new BranchGroup();

        BoundingSphere bounds =
	    new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

        // Kreieren einer Transformgroup, um alle Objekte
        // in ihrer Größe der Scene anzupassen
        TransformGroup objScale = new TransformGroup();
        Transform3D t3d = new Transform3D();
        t3d.setScale(0.2);
        objScale.setTransform(t3d);
        objRoot.addChild(objScale);

        // Diese TranformGroup wird vom Mousmanipulator benutzt
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);    //Falls gesetzt, dann ist das Verändern der Subknoten erlaubt (Schreibzugriff).
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);     //Falls gesetzt, dann ist das Auslesen der Subknoten erlaubt (Lesezugriff).
        objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);    //Falls gesetzt, dann ist das Hinzufügen von neuen Subknoten zu diesem Group-Objekt erlaubt.
        objScale.addChild(objTrans);

        // Diese TransformGroup dient zur Animation der Box
        TransformGroup objAni = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);    //Falls gesetzt, dann ist das Verändern der Subknoten erlaubt (Schreibzugriff).
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);     //Falls gesetzt, dann ist das Auslesen der Subknoten erlaubt (Lesezugriff).
        objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);    //Falls gesetzt, dann ist das Hinzufügen von neuen Subknoten zu diesem Group-Objekt erlaubt.
        objTrans.addChild(objAni);

        // Kreieren des Zylinder
        PolygonAttributes attr = new PolygonAttributes();
        attr.setCullFace(PolygonAttributes.CULL_NONE);
        Appearance ap = new Appearance();
        Material mat = new Material();
        mat.setLightingEnable(true);
        ap.setMaterial(mat);
        ap.setPolygonAttributes(attr);

        // Anlegen der Objekte
        Cylinder CylinderObj = new Cylinder(1.0f, 3.0f, ap);
        Box BoxObj = new Box(1,1,3,ap);
        ColorCube ColorCube = new ColorCube();

        // Einfügen der Objekte in Graph
        objTrans.addChild(CylinderObj);
        objAni.addChild(BoxObj);

        // Mouse-Rotationsverhalten kreieren                .....  Wird durch das Gedrückthalten der linken Maustaste aktiviert
        MouseRotate behavior = new MouseRotate(objTrans);
        objTrans.addChild(behavior);
        behavior.setSchedulingBounds(bounds);

        // Mouse-Zoomverhalten kreieren                     .....  Wird durch das Gedrückthalten der mittleren Maustaste aktiviert
        MouseZoom behavior2 = new MouseZoom(objTrans);
        objTrans.addChild(behavior2);
        behavior2.setSchedulingBounds(bounds);

        // Mouse-Translationsverhalten kreieren             .....  Wird durch das Gedrückthalten der rechten Maustaste aktiviert
        MouseTranslate behavior3 = new MouseTranslate(objTrans);
        objTrans.addChild(behavior3);
        behavior3.setSchedulingBounds(bounds);

        // Lichteffekte der Scene (2 unterschiedliche Lichtfarben)
        Color3f lColor1 = new Color3f(0.5f, 0.0f, 0.5f);
        Color3f lColor2 = new Color3f(0.7f, 0.7f, 0.0f);
        Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, 1.0f);
        Vector3f lDir2  = new Vector3f(0.0f, 0.0f, -1.0f);
        DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
        DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
        lgt1.setInfluencingBounds(bounds);
        lgt2.setInfluencingBounds(bounds);
        objScale.addChild(lgt1);
        objScale.addChild(lgt2);

        // Hintergrund mit Farbe definieren
        Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);      //blau
        Background bgNode = new Background(bgColor);
        bgNode.setApplicationBounds(bounds);
        objRoot.addChild(bgNode);

        // Optimiert den gesamten Inhaltszweig 
        objRoot.compile();

	return objRoot;

    }

    public magazin() {

    }

    public void init() {
	setLayout(new BorderLayout());
        GraphicsConfiguration config =
           SimpleUniverse.getPreferredConfiguration();

	Canvas3D c = new Canvas3D(config);
	add("Center", c);

        //JPanel p = new JPanel();
	//p.add(rotateB);
	//add("North", p);

        // Kreieren einer einfachen Scene und Anbindung
        // an das virtuelle Universum
	BranchGroup scene = createSceneGraph();
	u = new SimpleUniverse(c);

        // Dies setzt die ViewPlatform ein Stück zurück,
        // um alle Objekte der Scene betrachten zu können
        u.getViewingPlatform().setNominalViewingTransform();

	u.addBranchGraph(scene);
    }

    public void destroy() {
	u.cleanup();
    }

    // Das Folgende erlaub das Prog als eine Applikation
    // bzw. ein Applet laufen zu lassen
    public static void main(String[] args) {
        //Framegröße        
	new MainFrame(new magazin(), 256, 256);
    }

}


----------



## Oxygenic (7. Jan 2004)

Also wenn du dir über _so viele_ auch grundlegende Details nicht im Klaren bist ... bis wann muß die Arbeit denn fertig sein?

> Wie kann ich Objekte wie Cube, Box, ... *frei* in dem Universum platzieren????

http://java.sun.com/products/java-m...PI/j3dapi/javax/media/j3d/TransformGroup.html

> Wie kann ich einem Objekt eine Bewegung (horizontale rechts-links-Bewegung) aufzwingen????

http://java.sun.com/products/java-m..._API/j3dapi/javax/media/j3d/Interpolator.html
bzw.
http://java.sun.com/products/java-m...pi/javax/media/j3d/TransformInterpolator.html

> Wie kann ich einen Button einfügen, wenn ich gleichzeitig die Funktion Box im Applet verwende???
> Die Klassen der Beiden Objekte "beisen" sich....

Das verstehe ich nicht. Was ist denn die "Funktion" Box?

> Wie kann ich diese Bewegung durch einen Mouseclick auf einen Button starten????

http://java.sun.com/j2se/1.3/docs/api/java/awt/event/ActionListener.html


----------



## Draco (7. Jan 2004)

Danke erst mal für deine Hilfe.Ich werde mich mal durch die ganzen Sachen durcharbeiten.
Am besten wäre es, wäre die Arbeit schon letztes Jahr fertig geworden..... :-(


> Wie kann ich einen Button einfügen, wenn ich gleichzeitig die Funktion Box im Applet verwende??? 
> Die Klassen der Beiden Objekte "beisen" sich.... 

Soll heißen:

Wenn ich die Packete "com.sun.j3d.utils.geometry.*" und "javax.swing.*;" gleichzeitig importiere und dann
eine Box kreiere "Box BoxObj = new Box(1,1,3,ap);", bekomme ich Fehlermeldungen über Konflikte der Packete...


Draco


----------



## Draco (7. Jan 2004)

Gibt es nicht eventuell eine Möglichkeit, bei der ich sagen kann, platziere Objekt01 an x1,y1,z1 und Objekt02 an x2,y2,z2?

Die Links, die du mir oben hingestellt hast, übersteigen mein Verständnis einfach..... sorry

Ist es außerdem möglich eine Gruppe von Objekten durch die Maus bewegen zu lassen (zoom, rotate,transl - siehe mein Programmtext oben) und gleichzeitig eines der Objekte aus dieser Gruppe mit einer eigenständigen/automatischen Bewegung zu belegen?
Wenn ja, wie kann ich das machen?
Wenn möglich mit nem kurzen Beispieltext......

Draco


----------



## Oxygenic (7. Jan 2004)

> Gibt es nicht eventuell eine Möglichkeit, bei der ich sagen kann, platziere Objekt01 an x1,y1,z1 und Objekt02 an x2,
> y2,z2?

Ja. Und wenn du dir die Beschreibung zu der TransformGroup durchgelesen hättest, wärst du ganz schnell auf die Klasse gestoßen, in der genau das definiert wird: http://java.sun.com/products/java-m...3_API/j3dapi/javax/media/j3d/Transform3D.html

> Ist es außerdem möglich eine Gruppe von Objekten durch die Maus bewegen zu lassen (zoom, rotate,transl - siehe 
> mein Programmtext oben) und gleichzeitig eines der Objekte aus dieser Gruppe mit einer eigenständigen/automatischen 
> Bewegung zu belegen?

Ja, du hängst sie halt nur in jeweils separate Teil-SceneGraphen, von denen einer von deinem gewünschten Mouse...Behavior gesteuert wird und die anderen von einem der Interpolatoren, die die Bewegung berechnen, die du benötigst (Rotation, Translation oder was auch immer). Link zu den Interpolatoren: siehe oben.


----------

