# OrbitBehavior Rotationspunkt verändern?



## DarkLoG (21. Jan 2007)

Hallo Leute,

ich arbeite an einer Umsetzung eines Brettspiels in Java3D und kann das Spielbrett mit der Maus, dank Orbitbehavior, drehen zoomen etc. Allerdings dreht sich die Kamera immer um den Ursprung. Mit setRotationCenter kann ich doch diesen Punkt verändern richtig? Aber wie schaffe ich es am einfachsten, dass sich Kamera immer automatisch um die aktuelle Position des Mauszeigers dreht, so wie ich es von 3D Tools kenne?? Ich hoffe ihr versteht was ich meine und könnt mir weiterhelfen.

Gruß

DarkLoG


----------



## Marco13 (21. Jan 2007)

Hm. Hab schon lange nichts mehr mit J3D gemacht, aber ... Um die Position des Mauszeigers zu rotieren macht irgendwie keinen Sinn: Während des Rotierens verändert sich die Position. Und die Position des Mauszeigers ist im 3D-Raum ja eigentlich eher eine Linie. 

Meinst du vielleicht die Rotation um das aktuelle Blickzentrum? Da würde ich versuchen, mir mit 
canvas3d.getImagePlateToVworld(ipvwTransform)
die Transformation zu holen, die von Image-Plate-Koordinaten in Weltkoordiaten umrechnet, damit dann einen Punkt zu transformieren
Point3f p = new Point3f(0,0,0);
ipvwTransform.transform(p);
und um den Ergebnis-Punkt zu rotieren. Bin mir aber nicht sicher, ob das genau so funktioniert, und ob das das ist, was du möchtest. Poste ggf. nochmal eine genauere Beschreibung (und am besten ein Stück komplierbaren Code), dann schau ich nochmal.


----------



## DarkLoG (21. Jan 2007)

Doch doch ich denke schon,dass wir dasselbe meinen also natürlich meinte ich das Blickzentrum, um das rotiert werden soll, werd mal schauen ob ich mit deinem Code was hinbekomme. Danke schon mal für die Antwort. Code kann ich keinen Posten, denn ich hab auch nichts diesbezüglich versucht, bis jetzt alles noch Standard Orbitbehavior...

Gruß

DarkLoG


----------



## DarkLoG (21. Jan 2007)

Also hier ist jetzt mal der Code:


```
private void orbitControls(Canvas3D c)
   {
    orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
    orbit.setSchedulingBounds(bounds);
    

    ViewingPlatform vp = su.getViewingPlatform();
    vp.setViewPlatformBehavior(orbit);
    
    View user = su.getViewer().getView();
    user.setBackClipDistance(100);
    user.setFrontClipDistance(0.05);
  } 
  

  public void mouseClicked( MouseEvent e ) {
	  
	  if (e.getSource() == canvas3D){
		Transform3D temp3D = new Transform3D();
	    canvas3D.getImagePlateToVworld(temp3D);
	    
	    Point3d tempPoint = new Point3d(0,0,0);
	    temp3D.transform(tempPoint);
	    
	    System.out.println("Rotationspunkt: " + tempPoint);
	    
	    orbit.setRotationCenter(tempPoint);
	    orbit.setReverseRotate(true);
	  }
```

Das Problem ist jetzt dass man klicken muss um das Event auszulösen, Maustaste gedrückt halten ändert noch nix, das ist aber logisch, das weitaus größere Problem ist die Tatsache dass sich beim Klicken die ganze Kamera verschiebt und ich jetzt eine Bewegung ausführe, wie wenn ich die Kamera selbst bewegen würde. Ursprünglich war alles Reverse und damit konnte ich mit der Maus sozusagen statt der Kamera das Spielbrett drehen zoomen etc. und was ich eigentlich wollte ist jetzt das wenn sich eine Spielfigur im Blickzentrum befindet man die drehen und wenden kann also die Kamera um diese Figur bewegen anstelle immer das gesamte Spielbrett um den Ursprung zu rotieren - hoffe meine Ausführungen sind diesmal besser.

Gruß

DarkLoG


----------



## Marco13 (22. Jan 2007)

Tja, hat ein bißchen länger gedauert, aber ich hatte die letzten Tage keine Lust, mir da erst was compilierbares zusammenzuklicken. 

Hab jetzt mal ein bißchen rumprobiert. Es scheint, als wäre für das, was du vorhast, das OrbitBehavior in dieser Form nicht so geeignet. Sobald man ein RotationCenter setzt, wird die View so verändert, dass dieses RotationCenter in der Bildschirmmitte ist. Eigentlich wolltest du ja genau das umgekehrte: Immer um die Bildschirmmitte rotieren, egal, wo die gerade liegt. 

Das soll keine Empfehlung sein, aber ...: Ich würde versuchen, das nicht mit einem OrbitBehavior zu machen, sondern mit einem MouseRotate-Behavior, das die View-Transform beeinflusst. Aber habe schon lange nichtsmehr damit gemacht, also kann es sein dasss das nicht so funktioniert, wie ich es mir gerade vorstelle, oder dass das, was du machen willst, doch "irgendwie" mit dem OrbitBehavior möglich ist...


----------



## DarkLoG (23. Jan 2007)

Danke für deine Antwort, aber dann werd ichs mal vorläufig auf Eis legen und mich um die wichtigen Dinge kümmern, das Teil muss schließlich fertig werden.

Gruß

DarkLoG


----------

