SharedGroup benutzen

Status
Nicht offen für weitere Antworten.
T

thisisme

Gast
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:

Code:
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
Code:
 javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be added
verantwortlich dafür scheint die Zeile
Code:
objRoot.addChild(myRotationBehavior);

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

Danke!
 

Illuvatar

Top Contributor
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.
 
G

Guest

Gast
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

Code:
[...]
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

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

Code:
[...] 
TransformGroup objRotate = new TransformGroup(); 
TransformGroup objMove = new TransformGroup(); 
      
ColorCube cube = new ColorCube(0.4); 
objRotate.addChild(cube); 
objMove.addChild(objRotate);  // <-- da
[...]
 
Status
Nicht offen für weitere Antworten.

Oben