# Umrechnung zwischen Bildschirm und Weltkoordinaten



## h0b0 (14. Mai 2007)

Ich versuche, einen Faktor zu berechnen, mit dem ich in einer Parallelprojektion einen Pixelabstand auf der Canvas3D in einen Vektor im Weltkoordinatensystem umrechnen kann. Allerdings liegt mein Ergebnis immer um einen konstanten Faktor neben dem mit einer Pick-Canvas ermittelten korrekten Wert. Diesen gleiche ich im Moment mit der Konstanten LINEARE_ABWEICHUNG mehr schlecht als recht aus. Wie diese Konstante zustande kommt, ist mir allerdings ein Rätsel.
Hat jemand eine Idee, was ich nicht berücksichtigt habe?

```
final double  LINEARE_ABWEICHUNG = 1.30479102956167;
double ratio = myCanvas3D.getPhysicalWidth() / myCanvas3D.getWidth();
double pixelToMeters = (ratio * LINEARE_ABWEICHUNG) / (myCanvas3D.getView.getScreenScale());
```


----------



## Marco13 (14. Mai 2007)

Ich habe mich vor einiger Zeit mit ähnlichen Problemen rumschlagen müssen, und seitdem hasse ich das View-Model von Java3D aber das ist auch schon das richtige Stichwort: Wenn du das in Weltkoordinaten umrechnen willst, wirst du wohl vermutlich irgendwie die View mit einbeziehen müssen. Das myCanvas3D.getPhysicalWidth() liefert (soweit ich mich erinnere!) die Breite des Canvas auf dem Bildschirm (ja, auf dem Computermonitor - abhängig von irgendeiner obskuren Auflösung, 72 dpi oder so). 

Ganz allgemein würde ich es so versuchen: 

Du hast zwei Positionen, die in Pixel-Koordinaten gegeben sind. Diese kannst du mit 
canvas.getPixelLocationInImagePlate(Point2d pixelLocation, Point3d imagePlatePoint)
umrechnen in Punkte in Image-Plate-Koordinaten. Und die Image-Plate-Koordinaten kannst du mit der Transform3D, die du mit
canvas.getImagePlateToVworld(Transform3D t) 
erhältst, umrechnen in Weltkoordinaten. Der Abstand zwischen diesen Punkten müßte dann der gesuchte sein...

Viel Spaß noch :wink:


----------



## Guest (27. Jul 2007)

Ich sitze gerade an einem ähnlichen Problem, hänge es daher mal in diesen Thread ein.

Ich möchte eigentlich nur bei einem Klick auf mein Canvas3D wissen, welchem Punkt auf der z=0-Ebene das in meinem Universe entspricht.

Mein eigentlicher Ansatz war:

```
Vector3f position (Kameraposition)
Canvas3D canv (Das 3D-Canvas)
...
Vector3f((float)(((float)px/canv.getWidth())*canv.getPhysicalWidth()+position.getX()),
(float)(((float)py/canv.getHeight())*canv.getPhysicalHeight()+position.getY()),
0f)
```

Tatsächlich gibt es einen kleinen Unterschied zwischen einem Klick am linken und einem am rechten Canvasrand, doch ist der viel zu klein; die Koordinaten sind falsch.


----------



## Guest (29. Jul 2007)

Hat denn niemand Lösungsansätze oder Ideen dazu?  :roll:


----------

