Login
Newsletter
Werbung

So, 18. Juli 2004, 00:00

Programmieren mit Looking Glass 3D

Erscheinungen

Dem aufmerksamen Leser ist bestimmt der letzte Parameter TableApp im Konstruktor von GlassyPanel aufgefallen. App ist keineswegs die Abkürzung für Application, sondern für Appearance. Das Aussehen eines jeden 3D-Objektes wird mit einer sogenannten Appearance eingestellt. Dazu gibt es mehrere Klassen, hier verwenden wir SimpleAppearence.

private static Appearance TableApp
    = new SimpleAppearance(0.6f, 1.0f, 0.6f, 1.0f,
    SimpleAppearance.DISABLE_CULLING);

Die Variable TableApp ist als objektglobales Feld definiert. Die ersten drei Parameter sind die Farben Rot, Grün und Blau, jeweils im Wertebereich 0.0 bis 1.0. Der vierte Wert "1.0" ist der Alpha-Kanal, also die Transparenz. 1.0 bedeutet völlig deckend, 0.0 bedeutet völlig durchsichtig. Als letzten Parameter wird noch ein Typ angegeben.

Translation

Jetzt wird das Netz erzeugt. Dazu wird einfach ein Box-Objekt Net erzeugt.

Box Net = new Box(0.0003f,TableHeight*0.55f,NetHeight,NetApp);
Component3D NetComp = new Component3D();
NetComp.addChild(Net);
NetComp.setTranslation(0.0f,0.0f,NetHeight/2.0f);
top.addChild(NetComp);

Auch hier sehen wir die Verwendung der Appearence NetApp. Eine neue Funktion sehen wir ebenfalls: setTranslation(). Damit wird ein Component3D verschoben. Die drei Koordinaten sind die Verschiebung in X-, Y- und Z-Richtung.

Rotation

Nach dem Netz wird der Ball angelegt. Nach dem Ball wird eine kleine rote Kreisscheibe erzeugt, die den Ziel-Punkt des Balles auf der gegenüberliegenden Tischseite markiert.

Primitive MarkShape = new Cylinder(0.003f,0.001f,MarkApp);
Component3D Mark = new Component3D();
Mark.setRotationAxis(1.0f,0.0f,0.0f);
Mark.setRotationAngle((float)Math.toRadians(90));
Mark.addChild(MarkShape);
top.addChild(Mark);

Dazu wird eine Cylinder-Klasse (Nachfolger von Primitive) MarkShape initialisiert. Sie hat 3 mm Durchmesser und ist 1 mm hoch. Auch hier wird wieder eine Appearence zur Einstellung der Farbe verwendet. Hier sehen wir wieder etwas Neues: Das Objekt wird gedreht. Zuerst wird die Rotations-Achse des Component3D-Objekts festgelegt. Hier ist sie parallel zur X-Achse. Danach wird rund um diese Achse die Scheibe um 90° gedreht. Die Funktion setRotationAngle() erwartet eine Angabe in Radianten, deshalb wird toRadians() aus der Math-Klasse verwendet.

Action mit Timern

Hiermit sind sämtliche 3D-Objekte angelegt. Jetzt brauchen wir etwas Action. Der Ball soll ja fliegen, und das tut er in der vierten Dimension, in der Zeit. Dazu legen wir einen einfachen Timer an. Dieser Timer ruft alle 10 ms eine Methode auf, die die Position des Balles verändert. Sie hat auch noch allerhand weitere Aufgaben, wie z.B. die Berechnung der Flugbahn.

Timer timer = new Timer();
timer.scheduleAtFixedRate(new PingPongAction(Ball,Mark,TableWidth,TableHeight,NetHeight), 0, 10);

scheduleAtFixedRate() erwartet eine Klasse des Typs TimerTask. Wir werden diese gleich besprechen. Vorher aber legen wir noch den Schließ-Knopf an. Dieser ist auch aus Lg3dHelp übernommen.

Component3D closeButton = new Button(buttonSize,
 closeButtonOffAppearance, buttonOnSize, closeButtonOnAppearance);
closeButton.setCursor(Cursor3D.SMALL_CURSOR);
closeButton.setTranslation(TableWidth * 0.5f, TableHeight * 0.5f, 0.001f);
top.addChild(closeButton);

Die Klasse Button ist ein Nachfahre von Component3D und kann daher direkt mit setTranslation() verschoben werden. Die Methode setCursor() stellt den Maus-Cursor ein, der über dem closeButton-Objekt angezeigt wird. Er ist im Gegensatz zum normalen Cursor ein kleinerer Pfeil.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung