# Java3D: Primitives zu einem Objekt kombinieren



## Stefan1971HH (19. Nov 2012)

Hi,

mittels der Geometry-Klassen kann man selbstdefinierte Objekte zu einem Shape3D Objekt
zusammenfassen (bzw. zunächst zu einer Instanz einer Geometry-Subklasse, die dann einem
Shape3D Konstruktor übergeben wird).

Geht etwas entsprechendes auch mit den Java3d Primitives? Wenn ich, sagen wir, eine"plastische Linie" so darstellen will, dass ihre Endpunkte durch zwei kleine, von einem  langen dünnen Cylinder verbundene Spheres gebildet werden - lässt sich das so machen, dass diese Linie in ihrer Gesamtheit als ein Objekt (welcher Klasse auch immer) referenzierbar ist? Natürlich kann ich alle Bestandteile der Linie in einer BG oder TG entsprechend anordnen, aber dann wären diese noch immer separate Nodes.
Hat jemand eine Idee?

-danke


----------



## Marco13 (19. Nov 2012)

Man müßte genauer wissen, was du erreichen willst. Man kann ja sowas machen wie

```
class ThickLine
{
    private BranchGroup bg = // Die Linie, mit allem drum und dran

    public BranchGroup getNode() 
    {
        return bg;
    }

}
```


----------



## Stefan1971HH (22. Nov 2012)

Ich hätte gern eine Datenstruktur, in der die Komposition der Primitives als ein Objekt ansprechbar
ist und im SzeneGraph als ein Node autaucht.


----------



## Stefan1971HH (22. Nov 2012)

Die "Linie" soll dann analog zu einer herkömmlichen Linie in einem Shape3D Objekt transformiert werden können, wobei z.b. eine Skalierung als Verschiebung der Spheres (die selber nicht vergrößert werden) sowie entsprechende Verschiebung und Verlängerung des verbindenden Cylinders interpretiert werden soll.


----------



## Marco13 (22. Nov 2012)

Ja, das ist dann etwas aufwändiger. Die Längenänderung ist ja eigentlich nur eine Skalierung, aber natürlich soll das die Spheres nicht zu Eiern verzerren. Als reiner Node, bei dem man eine TransformGroup davorschaltet um die Länge zu ändern, wird das darum m.E. nicht funktionieren. Mit einer eigenen Klasse, die intern sowas hat wie

```
Node root
    TransformGroup tg;
        TransformGroup forCylinder;
            Cylinder
    TransformGroup forSphere0;
        Sphere0
    TransformGroup forSphere1;
        Sphere1
```
und vielleicht noch Methoden wie "setEndpoints(Tuple3f p0, Tuple3f p1)" usw. sollte das aber machbar sein.


----------



## Stefan1971HH (22. Nov 2012)

Ja, es ist nur etwas unpraktisch, dass man für jedes Bestandteile eine extra TransformGroup braucht - und eine übergeordnete TransformGroup für alle Teile. Wenn das ganze zur Laufzeit interaktiv hinzugefügbar sein soll, muss man sogar noch eine BranchGroup dazwischenschalten. Nicht so ganz trivial ist, dass die Ausrichtungg des Zylinders entsprechend der Positionen der Kugeln berechnet werden muss, aber dazu ist

https://forums.oracle.com/forums/thread.jspa?threadID=1275190

sehr hilfreich.-
Plötzlich bekomme ich beim Versuch, mein Programm zu starten, allerdings immer die Meldung:





> run:
> javax.media.j3d.IllegalRenderingStateException: GL_VERSION
> at javax.media.j3d.NativePipeline.createNewContext(Native Method)
> at javax.media.j3d.NativePipeline.createNewContext(NativePipeline.java:2775)
> ...



Ob dies mit meinem Wechsel zu Windows 8 zusammenhängt? Für meine OnBoard Grafik unter Windows 8 bietet AMD nur einen schon "Legacy" gelabelten Treiber vom Juni an..unter Windows 7 (mit neuerem Treiber) hatte ich diese Meldung nicht.


----------



## Marco13 (22. Nov 2012)

Ja, die verlinkte impementierung sieht auf den ersten Blick recht strightforward aus (ggf. muss man aufpassen: Bei [c]axis.cross(init, needed);[/c] kommt ein Nullvektor raus, wenn die beiden Argumente gleich sind!). Ansonsten ... man kann sich, wie angedeutet, eine Klasse erstellen, die man dann sehr leicht verwenden kann (dafür sind Klassen da)

```
ThickLine line = new ThickLine(start, end);
line.rotate(axis, angle);
node.addChild(line.getRoot());
```
oder so...

Die Fehlermeldung ... ja, ist wohl eine Treibersache (mehr kann ich da gerade nicht sagen).


----------



## Stefan1971HH (22. Nov 2012)

Ich habe in den AMD-Foren diesen Workaround für das Treiberproblem gefunden:
AMD Game Forums - Where are my Windows 8 drivers?

Hat bei mir funktioniert.


----------

