# Java3D: Objekte platzieren und entfernen?



## thewulf00 (21. Jun 2011)

Hallo!


*Objekte hinzufügen:*
Wenn ich ein Objekt hinzufüge, dann mache ich es derzeit so, dass ich für jedes Objekt eine eigene TransformGroup anlege, damit ich das Objekt korrekt platzieren kann. Das klingt auf den ersten Blick etwas heavy, finde ich. Ist das das richtige Vorgehen oder habe ich etwas missverstanden?

```
private TransformGroup moveCube(float x, float y, float z, Primitive cube)
{
  Transform3D      cubePosition  = new Transform3D();
  TransformGroup   cubeContainer = new TransformGroup();
        
  cubePosition.setTranslation(new Vector3f(x, y, z));
  cubeContainer.addChild(cube);
  cubeContainer.setTransform(cubePosition);
        
  return cubeContainer;
}
```


*Objekte entfernen:*
Ich habe jetzt schon mehrere Suchen hinter mir. Doch anscheinend ist das Thema etwas ... schwierig. Wie kann ich einen Cube entfernen, den ich z.B. mittels obigem Code angelegt habe?

Ich habe bisher drei Informationen dazu gefunden:
1) Objekt weg-verschieben. (Das ist offensichtlich keine Lösung)
2) Objekt unsichtbar machen, über einen Switch.
3) Objekt beim Erstellen in eine eigene BranchGroup legen und diese dann detachen.

Gedanken zu Variante 2): Ich möchte im Laufe des Spiels Objekte anlegen und entfernen. Die sammeln sich ja dann zu tausenden im Speicher bei dieser Variante, hm?
Gedanken zu Variante 3): Ich habe es noch nicht hinbekommen, eine BG einer TG zuzuordnen, so dass ich diese Variante nicht umsetzen kann.

Ideen? Anmerkungen? Magische Links?


----------



## Marco13 (21. Jun 2011)

Ja, die Vorgehensweise ist grundsätzlich nicht falsch. Für das Entfernen wäre es praktisch, zu wissen, wie genau das Objekt dann wieder entfernt werden soll... bei sowas wie
removeObject(somePrimitive);
müßte man ja die TransformGroup kennen, wo das Primitive dran hängt. Da gibts sicher verschiedene (underschiedlich elegante) Lösungen. Sollen die Primitive so enfernt werden, oder gibt es vielleicht eine Klasse, die "irgendeinen" Knoten für die Visuelle Repräsentation enthält? (Dieser Knoten könnte dann ja gleich die TransformGroup sein...)


----------



## thewulf00 (21. Jun 2011)

Nach oben genanntem Prinzip habe ich die TransformGroup natürlich vorliegen, sofern ich für jedes Objekt eine anlege (was ja bisher mein Vorgehen ist). Spätestens über setUserData() kann ich mir das merken.
Kannst Du mir Links, Tutorials oder Source-Ausschnitte posten, die das genaue Vorgehen zeigen?


----------



## thewulf00 (21. Jun 2011)

Sodele,

ich habe die Antwort ENDLICH selbst gefunden. (Hat ja nur den ganzen Tag gedauert.)

Die entscheidende Quelle war diese: Beispiel: Zeichnen mittels Java3D

Man muss einen kompletten BranchGroup-Pfad aufbauen (Root-BG, dann Objekt-BG), und anschließend das Objekt in einer TransformGroup in diese Objekt-BG einfügen. (Dann noch die Capability ALLOW_DETACH)

Also
Root-BG -> Objekt-BG -> Objekt-TG -> Objekt

Das Root-BG braucht die Capability ALLOW_CHILDREN_WRITE, das Objekt-BG ALLOW_DETACH.
Dann kann man z.B. folgendermaßen von einem Picking ausgehend das Objekt löschen:


```
TransformGroup transformGroupRemove = (TransformGroup) pickedObject.getParent();
BranchGroup    branchGroupRemove    = (BranchGroup)    transformGroupRemove.getParent();

rootBG.removeChild(branchGroupRemove);
```


----------



## aze (21. Jun 2011)

Hi

Man kann einen Knoten auch an/auschalten in dem man einen Switch Knoten einbaut.

Schöne Grüße

Aze


----------



## thewulf00 (22. Jun 2011)

Ja, das ist meine oben genannte Variante 2).
Dazu von oben zitiert:


> Gedanken zu Variante 2): Ich möchte im Laufe des Spiels Objekte anlegen und entfernen. Die sammeln sich ja dann zu tausenden im Speicher bei dieser Variante, hm?


----------



## aze (22. Jun 2011)

Achso.Habe ich überlesen.Sorry !


----------



## thewulf00 (22. Jun 2011)

aze hat gesagt.:


> Achso.Habe ich überlesen.Sorry !


Versteh mich nicht falsch. Laut der Meinung einiger "Java-Experten" ist das die effizienteste Art, etwas zu entfernen. Leider verstehe ich nicht, wie man damit in einem langen oder komplexen Spiel mit einer endlichen Menge RAM auskommen soll. 
Wenn Du dazu eine Info hast - her damit!


----------

