# Abhängikeit Translation von Fenstergröße



## Mike#35 (30. Mai 2007)

Hallo,

ich habe folgendes Problem. Ich möchte ein Objekt mit der Maus verschieben, dabei soll das Objekt 1:1 mit dem Mauszeiger verschoben werden. Weiß zufällig jemand, in wieweit Fenstergröße und Translationsfaktor zusammenhängen?

Vielen Dank


----------



## Marco13 (30. Mai 2007)

Das hängt in erster Linie von der View ab (Perspektivische Verzerrung etc.). Genaugenommen müßtest du ja den Punkt des Objektes kennen, den du angeklickt hast. Und die Maus bewegt sich nunmal nur im 2-Dimensionalen. Du kannst also nur das Objekt auf einer Ebene herumschieben. Das wird vermutlich ziemlich hakelig, vor allem wegen des unschönen View-Modells von Java3D. Viele Probleme kann man mit den "Zauber-Funktionen"
getPixelLocationFromImagePlate(Point3d imagePlatePoint, Point2d pixelLocation)
getPixelLocationInImagePlate(int x, int y, Point3d imagePlatePoint) 
getVworldProjection(Transform3D leftProjection, Transform3D rightProjection)
getVworldToImagePlate(Transform3D t) 
getCenterEyeInImagePlate(Point3d position) 
von Canvas3D umschiffen. 

Sinngemäß (und SEHR abstrakt - über die Implementierungsdetails mußt du dir gedanken machen!) könnte man das (vielleich!) etwa so versuchen:

Man macht eine Methode, die zu einem Punkt, der in Pixelkoordinaten gegeben ist, einen Strahl in Weltkoordinaten berechnet

```
Ray computeRay(int x, int y)
{
     Gegeben ist ein Punkt in Pixel-koordinaten auf dem Bildschirm.
     Mit getPixelLocationInImagePlate kann man die in ImagePlate-Koordinaten umrechnen.
     getCenterEyeInImagePlate Liefert die Position des Auges in ImagePlate-Koordinaten
     Aus diesen beiden ImagePlate-Punkten kann man einen Strahl in ImagePlate-Koordinaten berechnen
     Diesen Strahl rechnet man mit der inversen Transform von getVworldToImagePlate(Transform3D t) in Weltkoordinaten um
}
```

Wenn man die Maus drückt, berechnet man für die aktuelle Mausposition diesen Strahl, schneidet den Strahl mit seinem Objekt, und bekommt den angeklickten Punkt und die Entfernung "z" dieses Punktes des Objektes vom Augpunkt.

Man bewegt die Maus an eine neue Position. Für die berechnet man wieder diesen Strahl. An der Position "z" dieses Strahls muß das Objekt liegen. Damit hat man die "Zielposition" des Objekts, und kann damit (und mit der aktuellen Position) die Translation ausrechnen.

Alles ohne Gewähr.


----------



## Mike#35 (30. Mai 2007)

Vielen Dank Maroc13!

Ich habe auch eine eigene Lösung gefunden und poste sie mal, falls andere das gleiche Problem plagt. Ich nutze die Klasse "MouseTranslate" um die TransformationsGruppe zu überwachen. Wenn sich die Fenstergröße ändert, berechne ich den Translationsfaktor wie folgt:

TranslationsFaktor = 2.0 / Breite_des_Canvas3D

Die 2.0 ergibt sich aus dem sichtbaren Bereich der X-Achse bei Z=0. Der Bereich geht von -1.0 bis +1.0 und daraus folgt ein Abstand von 2. Ich habe das Ganze unter verschiedenen Auflösungen und Fenstergrößen getestet und keine Probleme gehabt.  


```
Dimension d = new Dimension(); 
c3d.getSize(d);

MouseTranslate = new MouseTranslate()
mt.setFactor(2.0/d.getWidth());
```


----------



## Marco13 (31. Mai 2007)

Wie das mit Perspektivischer Verzerrung und unterschiedlichen Entfernungen des Objektes zusammen funktionieren soll, ist mir zwar nicht klar, aber wenn das Problem gelöst ist, ists ja gut...


----------

