3D Objekte mit einer Linie Verbinden

mattn

Aktives Mitglied
ich will 2 würfel (objekt 'box') mit einer linie verbinden
hier die transformgroups und die objekte
Java:
TransformGroup BoxTG = new TransformGroup();
Transform3D BoxT3D = new Transform3D();
BoxT3D.setTranslation(new Vector3f(0f,0f,-10f));
BoxTG.setTransform(BoxT3D);
		
TransformGroup BoxTG2 = new TransformGroup();
Transform3D BoxT3D2 = new Transform3D();
BoxT3D2.setTranslation(new Vector3f(2f,0f,-10f));
BoxTG2.setTransform(BoxT3D2);

box1 	= new Box(0.5f,0.5f,0.5f, BoxAppearance);
box2 	= new Box(0.5f,0.5f,0.5f, BoxAppearance);

ich will will nun die mittelpunke der beiden würfel bestimmen da diese punkte start und ende für die linie sind

ich habe mir das so gedacht...
Java:
public void center(Box x){
		//Mittelpunkt holen
		bar = new Point3d();
		if ( x.getBounds() instanceof BoundingSphere ) {
			((BoundingSphere)x.getBounds()).getCenter(bar);
			if(x == box1)System.out.println("box1");
			if(x == box2) System.out.println("box2");
			System.out.println("center is: " + bar);
		}
	}

als output bekomm ich den punkt auch in der form
Code:
(-0.05405956193200769, -0.22147945123557278, -0.05405956193200769)

um an die einzelnen pkt zu kommen werd ich das wohl zum sting umwandeln und das dann via array auslesen....

so nun das problem... die mittelpunkte der beiden würfel sind exakt gleich...liegt bestimmt daran das diese koordinaten auf den würfel und nicht auf das universe beziehen...
wie kann ich das so ändern das ich die koordnaten der mittelpunkte der würfel relativ zum universe bekomm, damit ich diese mit folgender methode als punke übergeben kann

Java:
public void createLine(){
	    
		Appearance app = new Appearance();
	    ColoringAttributes ca = new ColoringAttributes(white,
	        ColoringAttributes.SHADE_FLAT);
	    app.setColoringAttributes(ca);
		// Plain line
	    Point3f[] plaPts = new Point3f[2];
	    plaPts[0] = new Point3f(-0.9f, -0.7f, 0.0f);
	    plaPts[1] = new Point3f(-0.5f, 0.7f, 0.0f);
	    
	    LineArray pla = new LineArray(2, LineArray.COORDINATES);
	    pla.setCoordinates(0, plaPts);
	    Shape3D plShape = new Shape3D(pla, app);
	    rootBG.addChild(plShape);
	}

so nun will ich die linie zeichnen ....

muss irgendwie mit getLocalToVworld gehen ...
bekomm da aber auch keinen pkt raus
 
Zuletzt bearbeitet:

als output bekomm ich den punkt auch in der form
Code:
(-0.05405956193200769, -0.22147945123557278, -0.05405956193200769)
um an die einzelnen pkt zu kommen werd ich das wohl zum sting umwandeln und das dann via array auslesen....


Klingt abenteuerlich. In der Methode hast du den Punkt doch schon, nämlich genau 'bar' ???:L


so nun das problem... die mittelpunkte der beiden würfel sind exakt gleich...liegt bestimmt daran das diese koordinaten auf den würfel und nicht auf das universe beziehen...

Das klingt auch seltsam ... Die Koordinaten des Mittelpunktes einer Box in Java3D sind (bezogen auf den Würfel bzw. die Box) immer (0,0,0). Wenn dort ein anderer Wert rauskommt (kann's gerade nicht testen) dann steckt da entweder schon eine Transform mit drin (und dann sollte die auch für beide Würfel unterschiedlich sein), oder bei der Sache mit der BoundingSpehe geht irgendwas gewaltig schief. Das mit der BoundingSphere ist eh ein Krampf. Man sollte das nicht brauchen. Wenn man eine Box mit
box1 = new Box(0.5f,0.5f,0.5f, BoxAppearance);
erstellt, dann sollte ihr Mittelpunkt bei (0,0,0) liegen.

Wenn man diese Box nun mit EINER TransformGroup transformiert
Code:
TransformGroup BoxTG2 = new TransformGroup();
Transform3D BoxT3D2 = new Transform3D();
BoxT3D2.setTranslation(new Vector3f(2f,0f,-10f));
BoxTG2.setTransform(BoxT3D2);
[b]sceneGraphWurzelknoten[/b].add(BoxTG2);
(also wenn sie NICHT an einer "Kette" von mehreren hintereinandergeschalteten TransformGroups) hängt, dann sollte der Mittelpunkt eigentlich genau dem Translationsanteil der Transform3D entsprechen. Oder einfacher ausgedrückt: Im obigen Beispiel sollte der Mittelpunkt der Box bei (2f,0f,-10f) liegen ... Falls sie das nicht tut, wäre ein KSKB nicht schlecht, aber ich weiß nicht genau, wann nicht das ausprobieren könnte.

Falls die Boxes an einer "Kette" von mehreren hintereinandergeschalteten TransformGroups hängen, kann man sich die Transform3D der letzten TransformGroup (wo die Box dranhängt) mit getLocalToVWorld holen, und auch dort sollte der Mittelpunkt der Box dann einfach der Translationsanteil dieser Transform3D sein (also die letzte Spalte der Matrix)....
 
Wenn du eine Box einfach so zur Welt hinzufügst, ist ihr Mittelpunkt gleich dem Koordinaten-Ursprung der Welt.
Wenn diese Box dann nach "new Vector3f(0,0,-10)" transformiert wird, dann ist ihr Mittelpunkt auch genau bei (0,0,-10).

Ich kann dein Problem also nicht so ganz nachvollziehen...

edit: Übrigens hat die Klasse Point3d die drei öffentlichen Variablen x, y und z ...
Deine in String umwandeln und dann irgendwie in Array konvertieren kommt mir deshalb ziemlich umständlich vor. Point3d (Java 3D API)
 
Zuletzt bearbeitet:
Wenn du eine Box einfach so zur Welt hinzufügst, ist ihr Mittelpunkt gleich dem Koordinaten-Ursprung der Welt.
Wenn diese Box dann nach "new Vector3f(0,0,-10)" transformiert wird, dann ist ihr Mittelpunkt auch genau bei (0,0,-10).

ja das mit dem vector hab ich dann auch herausgefunden, indem ich die linie statisch von dem vector von box1 zu dem von box2 gezogen habe...


Ich kann dein Problem also nicht so ganz nachvollziehen...

ich will die würfel mit der maus bewegen und die linie soll dem würfel folgen.... bzw die line soll die würfel weiterhin verbinden.... das will ich mit dem mousepickbehavior machen.. wenn dieser 'aktiviert' wird soll das prog. den neuen mittelpunkt (vector der translation) des würfels auslesen, damit dieser punkt der funktion übergeben werden kann, welche die linie zeichnet

das ding ließt brav den vector aus ...
Java:
	public void koordinatenHolen(){
		System.out.println("koordinatenHolen");
		BoxTG.getTransform(BoxT3D);
		Vector3f translation = new Vector3f();
		BoxT3D.get(translation);
		System.out.println(translation);
	}

nur soll der das nur machen wenn
Java:
pickT.transformChanged(1, BoxT3D); //0-ROTATE | 1-TRANSLATE | 2-ZOOM

"true" ist

EDIT...
ok hat geklappt das der die koordinaten ausliest ...
habe wohl den falschen ansatz bei der callbacksache gehabt
der rest dürft 'nur' noch logik sein
 
Zuletzt bearbeitet:

Zurück
Oben