Nachdem hoon seine Starthilfe nicht mehr fortzuführen scheint, hab ich mir gedacht, ich schreib auch mal so was in der Art.
Ich werde allerdings noch einmal von vorne anfangen, und mich enger an das englische Java3D-Tutorial von Sun halten.
Bei den Tutorials will ich auch das hier erwähnen, woran Oxygenic mich erinnert hat:
Let's start:
1. Installation
Ihr benötigt natürlich ein Java-SDK und ein Java3D-SDK. Die neueste Version ist 1.3.1, ob noch mehr kommt, ist fraglich. Die API-Dokumentation ist natürlich auch nützlich.
Das Java3D-SDK gibt es in zwei Versionen: OpenGL und DirectX. Ich habe die Erfahrung gemacht, dass DirectX performancemäßig um einiges besser ist, aber OpenGL ist eben plattformunabhängig. Diese Beschreibung ist über DirectX, OpenGL ist aber sehr ähnlich.
2. Grundlagen
Die Pakete, die mitgeliefert werden:
javax.media.j3d: Das wichtigste Paket, in der API dokumentiert, enthält die grungliegenden Klassen.
javax.vecmath: Enthält Klassen für 2- bis 4-Dimensionale Punkte/Farben/Vectoren/Matrizen u.ä., auch in der API dokumentiert.
com.sun.j3d.utils und Unterpakete: Enthält viele nützliche Hilfsklassen, allerdings nur hier dokumentiert (den Link habe ich dank Oxygenic hier gefunden), und das recht schlecht.
Der SceneGraph:
In jedem Java3d-Programm gibt es ein javax.media.j3d.Canvas3D (bei allen Klassen muss man aufpassen, das D von 3d groß zu schreiben). Dieses Canvas3D besitzt einen javax.media.j3d.View. Dieser gehört zu einem javax.media.j3d.VirtualUniverse. Damit man nicht in jedem Programm ein VirtualUniverse machen muss, gibt es die Klasse com.sun.j3d.utils.universe.SimpleUniverse. Wenn man dieses benutzt, muss man nicht mehr machen, als ein neues SimpleUniverse zu instanzieren, dieses erhält im Konstruktor ein Canvas3D, der View wird automatisch hinzugefügt. Ein SimpleUniverse kann allerdings nur ein View (also sozusagen eine Kamera) im Geschehen haben, in den Java XTools gibt es eine Klasse MultiUniverse, mit der auch mehrere Views möglich sind, dazu komme ich später nochmal zurück.
Der SceneGraph ist dann das, was sämtliche Objekte im VirtualUniverse enthält. Ein VirtualUniverse hat mehrere javax.media.j3d.Locales, an die javax.media.j3d.BranchGroups gehängt werden können.
BranchGroup ist von javax.media.j3d.Node abgeleitet, d.h. es kann in der parent-child-Beziehung eines SceneGraphs/einer Locale hinzugefügt werden. Jedes Node kann nur ein Parent-Node haben; außerdem ist BranchGroup aus javax.media.j3d.Group abgeleitet, Group ist ein Node, welches child-Nodes haben kann, BranchGroup ist eine Standard-Implementierung von Group, BranchGroup hat keine speziellen Eigenschaften. BranchGroups haben die Methode detach, mit der sie (und alle Kindknoten) äußerst komfortabel entfernt werden können.
Genug damit fürs erste.
Kapiert? :wink:
Capabilities:
Ein wichtiges Konzept in Java3d sind die Capabilities. Bevor ein SceneGraph live, also auf dem Bildschirm, ist können Capabilities gesetzt werden, die später bestimmte Veränderungen zulassen.
Sie können über die Methode SceneGraphObject(Node ist aus dieser Klasse abgeleitet)#setCapability bzw clearCapability gesetzt werden. |-Verknüpfungen funktionieren nicht, jedes Capability-Bit muss einzeln gesetzt werden.
Wenn bestimmte Capabilities nicht gesetzt sind, kann Java3d Optimierungen vornehmen (z.B. mehrere Groups zu einer zusammenfassen).
Das erste Programm:
Damit kann man jetzt das erste Programm schreiben (es ist ein ähnlich wie das HelloJava3Da-Programm)(Ich merke gerade, hoon hat damals übrigens ein ziemlich ähnliches Beispielprogramm geschrieben):
Na gut, sehr interessant ist das Programm noch nicht, aber wenn man den Würfel dann dreht, sieht das schon ganz gut aus.
Ein kleiner Vorgeschmack:
Fügt mal vor der compile-Methode
ein, dann könnt ihr den Würfel mit der Maus drehen.
Ich werde jetzt die nächsten zwei Wochen weg sein, aber dann mache ich natürlich weiter.
In der Hoffnung, das Java3D-Forum damit etwas anzuregen
Illuvatar
Ich werde allerdings noch einmal von vorne anfangen, und mich enger an das englische Java3D-Tutorial von Sun halten.
Bei den Tutorials will ich auch das hier erwähnen, woran Oxygenic mich erinnert hat:
Oxygenic hat gesagt.:
Let's start:
1. Installation
Ihr benötigt natürlich ein Java-SDK und ein Java3D-SDK. Die neueste Version ist 1.3.1, ob noch mehr kommt, ist fraglich. Die API-Dokumentation ist natürlich auch nützlich.
Das Java3D-SDK gibt es in zwei Versionen: OpenGL und DirectX. Ich habe die Erfahrung gemacht, dass DirectX performancemäßig um einiges besser ist, aber OpenGL ist eben plattformunabhängig. Diese Beschreibung ist über DirectX, OpenGL ist aber sehr ähnlich.
2. Grundlagen
Die Pakete, die mitgeliefert werden:
javax.media.j3d: Das wichtigste Paket, in der API dokumentiert, enthält die grungliegenden Klassen.
javax.vecmath: Enthält Klassen für 2- bis 4-Dimensionale Punkte/Farben/Vectoren/Matrizen u.ä., auch in der API dokumentiert.
com.sun.j3d.utils und Unterpakete: Enthält viele nützliche Hilfsklassen, allerdings nur hier dokumentiert (den Link habe ich dank Oxygenic hier gefunden), und das recht schlecht.
Der SceneGraph:
In jedem Java3d-Programm gibt es ein javax.media.j3d.Canvas3D (bei allen Klassen muss man aufpassen, das D von 3d groß zu schreiben). Dieses Canvas3D besitzt einen javax.media.j3d.View. Dieser gehört zu einem javax.media.j3d.VirtualUniverse. Damit man nicht in jedem Programm ein VirtualUniverse machen muss, gibt es die Klasse com.sun.j3d.utils.universe.SimpleUniverse. Wenn man dieses benutzt, muss man nicht mehr machen, als ein neues SimpleUniverse zu instanzieren, dieses erhält im Konstruktor ein Canvas3D, der View wird automatisch hinzugefügt. Ein SimpleUniverse kann allerdings nur ein View (also sozusagen eine Kamera) im Geschehen haben, in den Java XTools gibt es eine Klasse MultiUniverse, mit der auch mehrere Views möglich sind, dazu komme ich später nochmal zurück.
Der SceneGraph ist dann das, was sämtliche Objekte im VirtualUniverse enthält. Ein VirtualUniverse hat mehrere javax.media.j3d.Locales, an die javax.media.j3d.BranchGroups gehängt werden können.
BranchGroup ist von javax.media.j3d.Node abgeleitet, d.h. es kann in der parent-child-Beziehung eines SceneGraphs/einer Locale hinzugefügt werden. Jedes Node kann nur ein Parent-Node haben; außerdem ist BranchGroup aus javax.media.j3d.Group abgeleitet, Group ist ein Node, welches child-Nodes haben kann, BranchGroup ist eine Standard-Implementierung von Group, BranchGroup hat keine speziellen Eigenschaften. BranchGroups haben die Methode detach, mit der sie (und alle Kindknoten) äußerst komfortabel entfernt werden können.
Genug damit fürs erste.
Capabilities:
Ein wichtiges Konzept in Java3d sind die Capabilities. Bevor ein SceneGraph live, also auf dem Bildschirm, ist können Capabilities gesetzt werden, die später bestimmte Veränderungen zulassen.
Sie können über die Methode SceneGraphObject(Node ist aus dieser Klasse abgeleitet)#setCapability bzw clearCapability gesetzt werden. |-Verknüpfungen funktionieren nicht, jedes Capability-Bit muss einzeln gesetzt werden.
Wenn bestimmte Capabilities nicht gesetzt sind, kann Java3d Optimierungen vornehmen (z.B. mehrere Groups zu einer zusammenfassen).
Das erste Programm:
Damit kann man jetzt das erste Programm schreiben (es ist ein ähnlich wie das HelloJava3Da-Programm)(Ich merke gerade, hoon hat damals übrigens ein ziemlich ähnliches Beispielprogramm geschrieben):
Code:
import javax.swing.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*; //SimpleUniverse
import com.sun.j3d.utils.geometry.ColorCube; //Ein vorgefertigtes Test-SceneGraphObject, das hier benutzt werden wird.
public class First3DProgram extends JFrame implements ActionListener //JFrame um Vermischung von Swing <-> Canvas3D (AWT) zu zeigen
{
public static final long serialVersionUID = 121121112l; //Für Java1.5-Unterstützung
//Konstruktor
public First3DProgram()
{
super ("Ein ColorCube");
setSize (500, 500);
setLocationRelativeTo (null); //zentrieren
setDefaultCloseOperation (DO_NOTHING_ON_CLOSE); //Schließen soll im Menu geschehen
JPopupMenu.setDefaultLightWeightPopupEnabled (false); //Damit das Menu funktioniert, lassts mal zum Test weg
setCloseMenuBar (this);
//Jetzt kommt der 3D-Teil
Canvas3D c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration()); //So am besten
SimpleUniverse simpleU = new SimpleUniverse (c3d); //Das VirtualUniverse, hier wird auch schon der View hinzugefügt
BranchGroup bg = new BranchGroup(); //Haupt-BranchGroup
bg.addChild (new ColorCube (0.4f/*Größe*/)); //ColorCube wird hinzugefügt
bg.compile(); //Optimiert das Rendern
simpleU.addBranchGraph (bg); //Fügt den SceneGraph hinzu
simpleU.getViewingPlatform().setNominalViewingTransform(); //Versetzt die Kamera so, dass man gleich etwas sehen kann
//So einfach war das :)
add (c3d); //Vor 1.5: getContentPane().add
setVisible (true);
}
//Beenden-Menu
private void setCloseMenuBar (JFrame f)
{
JMenuBar jmb = new JMenuBar();
JMenu jm = new JMenu ("Datei");
jmb.add (jm);
JMenuItem close = new JMenuItem ("Beenden");
jm.add (close);
close.addActionListener (this);
f.setJMenuBar (jmb);
}
public void actionPerformed (ActionEvent evt)
{
System.exit (0);
}
//Startmethode
public static void main (String[]args)
{
new First3DProgram(); //An "Insider": Ich werde nicht auf die Klasse MainFrame eingehen.
}
}
Na gut, sehr interessant ist das Programm noch nicht, aber wenn man den Würfel dann dreht, sieht das schon ganz gut aus.
Ein kleiner Vorgeschmack:
Fügt mal vor der compile-Methode
Code:
OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL); //OrbitBehavior liegt in dem Paket com.sun.j3d.utils.behaviors.vp
orbit.setSchedulingBounds (new BoundingSphere ());
simpleU.getViewingPlatform().setViewPlatformBehavior (orbit);
Ich werde jetzt die nächsten zwei Wochen weg sein, aber dann mache ich natürlich weiter.
In der Hoffnung, das Java3D-Forum damit etwas anzuregen
Illuvatar