# Darstellung einer tierischen Zelle



## Flocke (8. Jun 2007)

Hallo Leute,
ich versuche schon seit Tagen eine Zelle zu simulieren, doch irgendwie fehlt mir wohl das Verständnis der Funktionsweise einiger Klassen bzw. deren Methoden.

Das Ziel ist folgendes: 
Es soll eine Zellmembran dargestellt werden, die mit unterschidlichen Zellkomponenten (Nukleus, Metochondrien, usw.) gefüllt werden muss. Dabei soll die Plazierung zufällig erfolgen, so dass die Zelle bei jedem Aufruf unterschiedlich aussieht. 

Da sind wir auch schon bei meinem *Problem* :cry: . 
Ich wollte die Zelle Schritt für Schritt füllen. Die Zellmembran lege im Nullpunkt hin. Für die nächste Zellkomponente erzeuge ich einen Point3d und übergebe ihn an deren Transform3d. Als nächstes wollte ich testen, ob es durch diese Transformation evtl. zur Überschneidung der neuen Zellkomponente mit der Zellmembran gekommen ist. Wenn ja, soll eine entsprechende Korrektur vorgenommen werden, sonst kann nach dem gleichen Prinzip eine weitere Komponente eingefügt werden, die dann natürlich mit allen hervorgehenden Objekten auf Kollision überprüft werden soll. 

Nach dem Studium von API und vielem stöbern durch die Foren und Tutorials, schien es mir am logischsten die Klasse PickTool für meine Zwecke zu verwenden. 

Doch anscheinend ist das doch nicht das Richtige.  Wenn ich versuche mit PickTool mögliche Kollisionen zu ermitteln, kommt eine Meldung


> java.lang.IllegalStateException: Picking can only work if BranchGroup is alive


Alive soll er aber erst werden, nachdem im Hintergrund alle notwendigen Berechnungen abgeschlossen sind.
Weiß jemand vielleicht einen Rat? 
Vielen Dank für jede Hilfe.
Flocke


----------



## Flocke (11. Jun 2007)

Hat denn gar keiner eine Idee, wie man so was realisieren könnte? Weiß jemand vielleicht von anderen Programmiersprachen, wo man so was programmieren kann? Es muss dabei noch die Möglichkeit bestehen, Bilder in .wrl Format einzulesen. Es ist für mich sehr, sehr wichtig (Projektaufgabe). 
Gruß. Flocke


----------



## merlin2 (13. Jun 2007)

Wie lautet dein Code?


----------



## Flocke (15. Jun 2007)

Sorry, dass es so lange gedauert hat, hatte die Tage sehr viel um die Ohren. Hier ist eins von vielen Beispielen, die ich versucht habe:

```
public BranchGroup createSceneGraph(){
		
		 wurzel = new BranchGroup();
		 
		 picktool = new PickTool(wurzel);
		 TransformGroup transform_gruppe=new TransformGroup();
		 TransformGroup transform_gruppe2;
		 transform_gruppe_gr_kugel.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		 transform_gruppe_gr_kugel.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		 Transform3D transform3d=new Transform3D();
		
		 Appearance aussehen_gr_kugel=new Appearance(),aussehen_kl_kugel=new Appearance();
		
//		 Licht
		 AmbientLight gleichmaessiges_licht=new AmbientLight(new Color3f(1f,1f,1f));
		 DirectionalLight direktes_licht=new DirectionalLight(new Color3f(1f,1f,1f),new Vector3f(-0.5f,-0.5f,-1f));
		 BoundingSphere licht_grenze=new BoundingSphere(new Point3d(),100000);
		 gleichmaessiges_licht.setInfluencingBounds(licht_grenze);
		 direktes_licht.setInfluencingBounds(licht_grenze);
		 
//                      große Kugel anstelle einer Membran
		 Sphere gr_kugel = new Sphere(0.9f,Sphere.GENERATE_NORMALS,40,aussehen_gr_kugel);
		 aussehen_gr_kugel.setMaterial(new Material(new Color3f(0f,0f,1f),new Color3f(0f,0f,0f),new Color3f(1f,0f,0f),new Color3f(1f,1f,1f),100f));
		 aussehen_gr_kugel.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.NICEST,0.6f));
		 gr_kugel.setCollidable(true);
		
		 gr_kugel.setCapability(Sphere.ALLOW_COLLIDABLE_READ);
		 gr_kugel.setCapability(Sphere.ALLOW_COLLIDABLE_WRITE);
		 gr_kugel.setCapability(Sphere.GEOMETRY_NOT_SHARED);
		 gr_kugel.setCapability(Sphere.ALLOW_PICKABLE_READ);
		 
		 transform_gruppe_gr_kugel.addChild(gr_kugel);
		
		 
//		Shape3D anstelle von dem Zellkern

		 BranchGroup bgnucleus = new BranchGroup();
		 transform_gruppe.addChild(bgnucleus);
		 Shape3D nucleus = new Box(0.6, 0.6, 0.6);

		 nucleus.setAppearance(aussehen_gr_kugel);
		 nucleus.setCollidable(true);
		 nucleus.setPickable(true);
		 nucleus.setCapability(Shape3D.ALLOW_PICKABLE_READ);
		 nucleus.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
		 nucleus.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
		 nucleus.setCapability(Shape3D.ALLOW_COLLIDABLE_READ);
		 nucleus.setCapability(Shape3D.ALLOW_COLLIDABLE_WRITE);

		 Vector3d vec = zufall.setPosition("nucleus");
		 transform3d = new Transform3D();
		 transform3d.setTranslation(vec);
		 transform_gruppe.setTransform(transform3d);
		 
		 picktool = new PickTool(wurzel);
		 picktool.setMode(PickTool.GEOMETRY);
		 
//		 PickTool.setCapabilities(wurzel.cloneNode(true), 0);
		 
		 Point3d p3d = new Point3d(vec.getX(), vec.getY(), vec.getZ());
		 picksegin = new PickSegment(origin, p3d);

		 PickResult [] pickresult = picktool.pickAll();
		 int length = pickresult.length;

		 for (int i=0; i<length; i++){
			 System.out.println("GeometrieDaten: "+pickresult[i].getGeometryArray());
		 }

                         picktool.setShape(picksegin, p3d);
		 PickResult pr = picktool.pickClosest();

		 transform_gruppe.addChild(nucleus);
		 transform_gruppe_gr_kugel.addChild(transform_gruppe);
		 
//		Rotation mit der Maus
		 MouseRotate MouseCtrl=new MouseRotate(transform_gruppe_gr_kugel);
		 MouseCtrl.setSchedulingBounds(licht_grenze);
				 
		 wurzel.addChild(MouseCtrl);
		 wurzel.addChild(gleichmaessiges_licht);
		 wurzel.addChild(direktes_licht);
		 wurzel.addChild(transform_gruppe_gr_kugel);
		 wurzel.compile();
		 return wurzel;
	}
```

Der Code ist von mir nicht besonders gut kommentiert, also, wenn es Fragen gibt nur zu. 
Was ich hier versuche ist folgendes. Ich erzeuge eine große Kugel anstelle einer Membran und übergebe sie einfach an meine Haupt-TransformGroup. Die gr_kugel sitzt dann genau in der Mitte des SceneGraphen. Als Nächstes kreire ich ein Shape3D, welches den Zellkern darstellen soll. Für die Plazierung erzeuge ich einen Zufallspunkt. Diesen Punkt bekommt das Transform3D-Objekt vom nucleus. Nun gibt es drei Möglichkeiten:
1. der nucleus liegt komplett in der gr_kugel (gewünscht)
2. nucleus und gr_kugel  überschneiden sich
3. nucleus liegt außerhalb der gr_kugel 
Meine Idee war, eine Überprüfung vom Zufallspunkt aus ein Mal zum Mittelpunkt des SceneGraphen hin und einmal auf der Geraden, die durch Mittelpunkt und Zufallspunkt läuft, vom Zufallspunkt nach Außen durchzuführen. Aber wenn ich es mir jetzt überlege, wäre es wohl nicht ausreichend gewesen. Ich muss ja berücksichtigen, dass dieser Punkt nich der äußere Rand meines Objektes ist. Ach ja. Jetzt weiß ich gar nicht mehr weiter.
Hat vielleicht jemand eine Idee?


----------

