# SharedGroup benutzen



## thisisme (17. Dez 2006)

Hallo!

Ich habe 2 Behavior-Klassen, die beide Transformationen an einem Color-Cube vornehmen sollen und möchte dafür gerne 2 TransFormGroups verwenden. Wenn ich es richtig verstanden habe, brauche ich dazu eine SharedGroup:


```
public BranchGroup createSceneGraph(Canvas3D canvas) {
		BranchGroup objRoot = new BranchGroup();

		TransformGroup objRotate = new TransformGroup();
		TransformGroup objMove = new TransformGroup();
		
		objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		objMove.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		
		ColorCube cube = new ColorCube(0.4);
		objRotate.addChild(cube);
		
		SharedGroup g = new SharedGroup();
		g.addChild(objRoot);
		g.compile();
		
		Link s1 = new Link(g);
		s1.setCapability(Link.ALLOW_SHARED_GROUP_WRITE);
		Link s2 = new Link(g);
		s2.setCapability(Link.ALLOW_SHARED_GROUP_WRITE);

		objMove.addChild(s1);
		objZoom.addChild(s2);

		// rotation hinzufuegen
		MyRotation myRotationBehavior = new MyRotation(objRotate);
		myRotationBehavior.setSchedulingBounds(new BoundingSphere());
		objRoot.addChild(myRotationBehavior);
		
		// move hinzufuegen
		MyMovement m = new MyMovement(objMove);
		m.setSchedulingBounds(new BoundingSphere());
		objRoot.addChild(m);
		
		objRoot.compile();
		return objRoot;
	}
```

Beim Kompilieren bekomm ich folgende Exception

```
javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be added
```
verantwortlich dafür scheint die Zeile

```
objRoot.addChild(myRotationBehavior);
```

Wie muss ich denn jetzt das Behavior-Objekt hinzufügen? 

Danke!


----------



## Illuvatar (17. Dez 2006)

Wie du selbst sagst: "only a BranchGroup node may be added". Das würde heißen: BranchGroup machen und "dazwischen" hängen.

Allerdings habe ich das Gefühl, du hast das mit der SharedGroup falsch verstanden? SharedGroup bedeutet: Alles, was unterhalb dieser SharedGroup hängt, existiert nur einmal, erscheint aber an mehreren Stellen in der Szene. Die SharedGroup selbst wird nicht in den SceneGraph eingehängt, sondern an Link-Knoten übergeben. Überall, wo so ein Linkknoten dann ist, erscheint die SharedGroup.


----------



## Guest (19. Dez 2006)

Danke für die Erklärung, ist gar nicht so einfach, wenn man das alles zum ersten mal liest, aber das ist ja mit allem so  :wink: 

Ich bin auf die SharedGroup gekommen, weil ich sonst nicht wusste, wie ich das gleiche Objekt mehreren Behaviors zuweisen kann. Meine erste Idee war


```
[...]
TransformGroup objRotate = new TransformGroup();
TransformGroup objMove = new TransformGroup();
      
ColorCube cube = new ColorCube(0.4);
objRotate.addChild(cube); 
objMove.addChild(cube); 
[...]
```

Dann bekomm ich allerdings die Exception, dass ich mein Kind nicht mehreren Eltern zuordnen kann (was ja auch berechtigt ist). Hast Du sonst noch eine Idee, wie man das ohne SharedGroup lösen kann?


----------



## Illuvatar (21. Dez 2006)

Wetten, du wirst dir gleich an den Kopf schlagen? ;-)


```
[...] 
TransformGroup objRotate = new TransformGroup(); 
TransformGroup objMove = new TransformGroup(); 
      
ColorCube cube = new ColorCube(0.4); 
objRotate.addChild(cube); 
objMove.addChild(objRotate);  // <-- da
[...]
```


----------



## thisisme (21. Dez 2006)

> Wetten, du wirst dir gleich an den Kopf schlagen?


Recht hast du, vielen Dank!


----------

